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

Reply via email to