Author: davsclaus
Date: Thu Nov 19 11:33:29 2009
New Revision: 882112

URL: http://svn.apache.org/viewvc?rev=882112&view=rev
Log:
CAMEL-2203: Added option to jms consumer to test connection on startup.

Added:
    
camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsTestConnectionOnStartupTest.java
   (with props)
Modified:
    
camel/trunk/camel-core/src/main/java/org/apache/camel/FailedToCreateConsumerException.java
    
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultConsumer.java
    
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultProducer.java
    
camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConfiguration.java
    
camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConsumer.java
    
camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsEndpoint.java

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/FailedToCreateConsumerException.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/FailedToCreateConsumerException.java?rev=882112&r1=882111&r2=882112&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/FailedToCreateConsumerException.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/FailedToCreateConsumerException.java
 Thu Nov 19 11:33:29 2009
@@ -31,6 +31,11 @@
         this.uri = endpoint.getEndpointUri();
     }
 
+    public FailedToCreateConsumerException(Endpoint endpoint, String message, 
Throwable cause) {
+        super("Failed to create Consumer for endpoint: " + endpoint + ". 
Reason: " + message, cause);
+        this.uri = endpoint.getEndpointUri();
+    }
+
     public String getUri() {
         return uri;
     }

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultConsumer.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultConsumer.java?rev=882112&r1=882111&r2=882112&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultConsumer.java 
(original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultConsumer.java 
Thu Nov 19 11:33:29 2009
@@ -30,7 +30,7 @@
  * @version $Revision$
  */
 public class DefaultConsumer extends ServiceSupport implements Consumer {
-    private final transient Log log = LogFactory.getLog(getClass());
+    protected final transient Log log = LogFactory.getLog(getClass());
     private final Endpoint endpoint;
     private final Processor processor;
     private ExceptionHandler exceptionHandler;

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultProducer.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultProducer.java?rev=882112&r1=882111&r2=882112&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultProducer.java 
(original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultProducer.java 
Thu Nov 19 11:33:29 2009
@@ -29,7 +29,7 @@
  * @version $Revision$
  */
 public abstract class DefaultProducer extends ServiceSupport implements 
Producer {
-    private final transient Log log = LogFactory.getLog(getClass());
+    protected final transient Log log = LogFactory.getLog(getClass());
     private final Endpoint endpoint;
 
     public DefaultProducer(Endpoint endpoint) {

Modified: 
camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConfiguration.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConfiguration.java?rev=882112&r1=882111&r2=882112&view=diff
==============================================================================
--- 
camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConfiguration.java
 (original)
+++ 
camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConfiguration.java
 Thu Nov 19 11:33:29 2009
@@ -136,6 +136,7 @@
     private JmsKeyFormatStrategy jmsKeyFormatStrategy;
     private boolean transferExchange;
     private boolean transferException;
+    private boolean testConnectionOnStartup;
 
     public JmsConfiguration() {
     }
@@ -1312,4 +1313,12 @@
     public void setTransferException(boolean transferException) {
         this.transferException = transferException;
     }
+
+    public boolean isTestConnectionOnStartup() {
+        return testConnectionOnStartup;
+    }
+
+    public void setTestConnectionOnStartup(boolean testConnectionOnStartup) {
+        this.testConnectionOnStartup = testConnectionOnStartup;
+    }
 }

Modified: 
camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConsumer.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConsumer.java?rev=882112&r1=882111&r2=882112&view=diff
==============================================================================
--- 
camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConsumer.java
 (original)
+++ 
camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConsumer.java
 Thu Nov 19 11:33:29 2009
@@ -16,10 +16,14 @@
  */
 package org.apache.camel.component.jms;
 
+import javax.jms.Connection;
+
+import org.apache.camel.FailedToCreateConsumerException;
 import org.apache.camel.Processor;
 import org.apache.camel.SuspendableService;
 import org.apache.camel.impl.DefaultConsumer;
 import org.springframework.jms.listener.AbstractMessageListenerContainer;
+import org.springframework.jms.support.JmsUtils;
 
 /**
  * A {...@link org.apache.camel.Consumer} which uses Spring's {...@link 
AbstractMessageListenerContainer} implementations to consume JMS messages
@@ -76,6 +80,28 @@
         listenerContainer.start();
     }
 
+    /**
+     * Pre tests the connection before starting the listening.
+     * <p/>
+     * In case of connection failure the exception is thrown which prevents 
Camel from starting.
+     *
+     * @throws FailedToCreateConsumerException is thrown if testing the 
connection failed
+     */
+    protected void testConnectionOnStartup() throws 
FailedToCreateConsumerException {
+        try {
+            if (log.isDebugEnabled()) {
+                log.debug("Testing JMS Connection on startup for destination: 
" + getDestinationName());
+            }
+            Connection con = 
listenerContainer.getConnectionFactory().createConnection();
+            JmsUtils.closeConnection(con);
+
+            log.info("Successfully tested JMS Connection on startup for 
destination: " + getDestinationName());
+        } catch (Exception e) {
+            String msg = "Cannot get JMS Connection on startup for destination 
" + getDestinationName();
+            throw new FailedToCreateConsumerException(getEndpoint(), msg, e);
+        }
+    }
+
     @Override
     protected void doStart() throws Exception {
         super.doStart();
@@ -89,6 +115,10 @@
 
         // only start listener if auto start is enabled or we are explicit 
invoking start later
         if (initialized || getEndpoint().isAutoStartup()) {
+            // should we pre test connections before starting?
+            if (getEndpoint().isTestConnectionOnStartup()) {
+                testConnectionOnStartup();
+            }
             startListenerContainer();
         }
 
@@ -125,4 +155,14 @@
     public boolean isSuspended() {
         return suspended;
     }
+
+    private String getDestinationName() {
+        if (listenerContainer.getDestination() != null) {
+            return listenerContainer.getDestination().toString();
+        } else {
+            return listenerContainer.getDestinationName();
+        }
+    }
+
+
 }

Modified: 
camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsEndpoint.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsEndpoint.java?rev=882112&r1=882111&r2=882112&view=diff
==============================================================================
--- 
camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsEndpoint.java
 (original)
+++ 
camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsEndpoint.java
 Thu Nov 19 11:33:29 2009
@@ -865,6 +865,16 @@
         getConfiguration().setTransferException(transferException);
     }
 
+    @ManagedAttribute
+    public boolean isTestConnectionOnStartup() {
+        return configuration.isTestConnectionOnStartup();
+    }
+
+    @ManagedAttribute
+    public void setTestConnectionOnStartup(boolean testConnectionOnStartup) {
+        configuration.setTestConnectionOnStartup(testConnectionOnStartup);
+    }
+
     @ManagedAttribute(description = "Camel id")
     public String getCamelId() {
         return getCamelContext().getName();

Added: 
camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsTestConnectionOnStartupTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsTestConnectionOnStartupTest.java?rev=882112&view=auto
==============================================================================
--- 
camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsTestConnectionOnStartupTest.java
 (added)
+++ 
camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsTestConnectionOnStartupTest.java
 Thu Nov 19 11:33:29 2009
@@ -0,0 +1,68 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.jms;
+
+import javax.jms.ConnectionFactory;
+
+import org.apache.activemq.ActiveMQConnectionFactory;
+import org.apache.camel.CamelContext;
+import org.apache.camel.FailedToCreateConsumerException;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+import static 
org.apache.camel.component.jms.JmsComponent.jmsComponentClientAcknowledge;
+
+/**
+ * @version $Revision$
+ */
+public class JmsTestConnectionOnStartupTest extends CamelTestSupport {
+
+    @Test
+    public void testConnectionOnStartupTest() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                
from("activemq:queue:foo?testConnectionOnStartup=true").to("mock:foo");
+            }
+        });
+
+        try {
+            context.start();
+            fail("Should have thrown an exception");
+        } catch (FailedToCreateConsumerException e) {
+            // expected
+            assertEquals("Failed to create Consumer for endpoint: 
Endpoint[activemq://queue:foo?testConnectionOnStartup=true]. "
+                + "Reason: Cannot get JMS Connection on startup for 
destination foo", e.getMessage());
+        }
+    }
+
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext camelContext = super.createCamelContext();
+
+        // we do not start a broker on tcp 61111
+        ConnectionFactory connectionFactory = new 
ActiveMQConnectionFactory("tcp://localhost:61111");
+        camelContext.addComponent("activemq", 
jmsComponentClientAcknowledge(connectionFactory));
+
+        return camelContext;
+    }
+
+    @Override
+    public boolean isUseRouteBuilder() {
+        return false;
+    }
+}

Propchange: 
camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsTestConnectionOnStartupTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsTestConnectionOnStartupTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date


Reply via email to