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