Search code examples
javaapache-camelspring-jmsqpidjms-topic

JMS Connection not throwing JMSSecurityException on sending message to unauthorized route


I am using Apache Camel with Spring to send messages from my Java service. I need to handle/trigger certain events in case of any error occurred at exchange. I am using below code to achieve my objective.

try
    {
        producerTemplate.sendBody(endPoint, bytes);
    }
    catch (final RuntimeCamelException exception)
    {
        LOGGER.error("Exception occured in sendBody", exception.getMessage(), exception);
        handleError(); // handle error here.
    }

In order to test I set the value of endPoint to incorrect route name broadcast.SIMULATOR.ROUTE1. When I am running above code, I can see following error in console but it never comes inside catch block.

[33m16:15:51,714 WARN  [org.springframework.jms.connection.CachingConnectionFactory] (QpidJMS Connection Executor: ID:7dacac8c-93ce-48c0-92fe-8dc0e8:1) Encountered a JMSException - resetting the underlying JMS Connection: javax.jms.JMSSecurityException: Admin@QPID9019 cannot publish to broadcast with routing-key broadcast.SIMULATOR.ROUTE1 (/builddir/build/BUILD/qpid-cpp-1.36.0/src/qpid/broker/amqp/Authorise.cpp:126) [condition = amqp:unauthorized-access]
at org.apache.qpid.jms.provider.amqp.AmqpSupport.convertToException(AmqpSupport.java:143) [qpid-jms-client-0.23.0.jar:]
at org.apache.qpid.jms.provider.amqp.AmqpSupport.convertToException(AmqpSupport.java:117) [qpid-jms-client-0.23.0.jar:]  

I am sending multiple messages to the route. For first message, JMSSecurityException is logged in console and execution continues. From second message onwards, execution goes inside catch with IllegalStateException (Session is closed) .

How do I bring execution inside catch block with first message only (for JMSSecurityException)?


Solution

  • It depends on the JMS client you are using. As some of them send the message in an asynchronous fashion. They may have a configuration option you can use to turn this off.

    For example Apache ActiveMQ has this with asyncSend option http://activemq.apache.org/async-sends.html which you can then turn off.