camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jim Newsham <jnews...@referentia.com>
Subject exception handlers and jms (connection pool) failure
Date Mon, 18 Apr 2011 22:03:30 GMT

Hi,

We are using Camel 2.5.0 and ActiveMQ 5.4.1.  In our application, we see 
that failure to obtain a jms connection from the connection pool results 
in an unhandled exception which bubbles up to the caller, instead of it 
being handled by one of the global exception handlers that we have 
configured.  Is this expected behavior or a bug?

Below is a simple test case (code and output) which demonstrates what we 
are seeing.  We intentionally configure an activemq thread pool which 
will fail to create a connection, and then send a message to an activemq 
queue.  We expect the global exception handler for JMSException to 
handle the failure; instead, it is caught by the caller's (sender's) 
try/catch block.

package test;

import javax.jms.Connection;
import javax.jms.JMSException;
import org.apache.activemq.camel.component.ActiveMQComponent;
import org.apache.activemq.pool.PooledConnectionFactory;
import org.apache.camel.CamelContext;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;

public class TestCamelJmsExceptionHandling {

   private static final String QUEUE_URL = "activemq:queue:myqueue";

   public static void main(String... args) throws Exception {
     CamelContext context = new DefaultCamelContext();
     ActiveMQComponent activemqComponent = (ActiveMQComponent) 
context.getComponent("activemq");
     activemqComponent.setConnectionFactory(new PooledConnectionFactory() {
       public Connection createConnection(String userName, String 
password) throws JMSException {
         throw new JMSException("can't create connection");
       }
     });

     context.addRoutes(new RouteBuilder() {
       public void configure() throws Exception {
         onException(JMSException.class).log("handled jms exception");
         onException(Throwable.class).log("handled throwable");
       }
     });
     context.start();

     ProducerTemplate producerTemplate = context.createProducerTemplate();
     try {
       producerTemplate.sendBody(QUEUE_URL, "test");
     }
     catch(Exception e) {
       System.err.println("caught exception");
       e.printStackTrace();
     }
   }

}

- Apache Camel 2.5.0 (CamelContext: camel-1) is starting
- JMX enabled. Using ManagedManagementStrategy.
- Found 4 packages with 15 @Converter classes to load
- Loaded 149 type converters in 0.449 seconds
- Total 0 routes, of which 0 is started.
- Apache Camel 2.5.0 (CamelContext: camel-1) started in 0.771 seconds
caught exception
org.apache.camel.CamelExecutionException: Exception occurred during 
execution on the exchange: Exchange[Message: test]
     at 
org.apache.camel.util.ObjectHelper.wrapCamelExecutionException(ObjectHelper.java:1156)
     at 
org.apache.camel.util.ExchangeHelper.extractResultBody(ExchangeHelper.java:456)
     at 
org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:441)
     at 
org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:437)
     at 
org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:125)
     at 
org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:130)
     at 
util.TestCamelJmsExceptionHandling.main(TestCamelJmsExceptionHandling.java:50)
Caused by: org.springframework.jms.UncategorizedJmsException: 
Uncategorized exception occured during JMS processing; nested exception 
is javax.jms.JMSException: can't create connection
     at 
org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:316)
     at 
org.springframework.jms.support.JmsAccessor.convertJmsAccessException(JmsAccessor.java:168)
     at 
org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:469)
     at 
org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate.send(JmsConfiguration.java:171)
     at 
org.apache.camel.component.jms.JmsProducer.doSend(JmsProducer.java:315)
     at 
org.apache.camel.component.jms.JmsProducer.processInOnly(JmsProducer.java:269)
     at 
org.apache.camel.component.jms.JmsProducer.process(JmsProducer.java:93)
     at 
org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:99)
     at 
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:91)
     at 
org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:85)
     at 
org.apache.camel.processor.UnitOfWorkProducer.process(UnitOfWorkProducer.java:63)
     at 
org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:333)
     at 
org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:303)
     at 
org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:208)
     at 
org.apache.camel.impl.ProducerCache.sendExchange(ProducerCache.java:303)
     at org.apache.camel.impl.ProducerCache.send(ProducerCache.java:154)
     at 
org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:110)
     at 
org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:123)
     ... 2 more
Caused by: javax.jms.JMSException: can't create connection
     at 
util.TestCamelJmsExceptionHandling$1.createConnection(TestCamelJmsExceptionHandling.java:36)
     at 
org.apache.activemq.pool.PooledConnectionFactory.createConnection(PooledConnectionFactory.java:92)
     at 
org.springframework.jms.support.JmsAccessor.createConnection(JmsAccessor.java:184)
     at 
org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:456)
     ... 17 more

Thanks,
Jim

Mime
View raw message