I am facing a issue while trying to implement JMS transaction using Camel. Here is the scenario
1. Primary route which read the message from the queue(JMS_IN), pass the same exchange to the two sub route(direct route) 2. First sub route process the message successfully and send to the another queue(JMS_ONE) 3. Second sub route process the message and send to the another queue(JMS_TWO). 4. If any error occurred during the sub route processing all the message should rollback and original message sent to another queue(ERROR) that is dead letter queue. 5. In the example Context I have created throw RuntimeException during second sub route processing. 6. So expected behavior is to move the original message to ERROR queue, same time no message should send to JMS_ONE & JMS_TWO 7. But actual behavior is original message was sent to the ERROR queue, but message sent the JMS_ONE. I am using Apache Camel 2.24.0, Jboss HornetQ and spring transaction manager. Kindly help me on this, I am struck at this for couple of days Camel Context Below <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate"> <property name="environment"> <props> <prop key="java.naming.factory.initial">org.jboss.naming.remote.client.InitialContextFactory</prop> <prop key="java.naming.provider.url">http-remoting://localhost:9089</prop> <!--<prop key="java.naming.factory.url.pkgs">org.jboss.naming:org.jnp.interfaces</prop>--> <prop key="java.naming.security.principal">TESTUSR</prop> <prop key="java.naming.security.credentials">TESTUSR</prop> </props> </property> </bean> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="jmsConnectionFactory"/> </bean> <bean id="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiTemplate" ref="jndiTemplate"/> <property name="jndiName" value="jms/RemoteConnectionFactory"/> </bean> <bean id="jmsTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager"> <property name="connectionFactory" ref="jmsConnectionFactory"/> </bean> <bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration"> <property name="connectionFactory" ref="jmsConnectionFactory"/> <property name="transactionManager" ref="jmsTransactionManager"/> <property name="transacted" value="true"/> </bean> <bean id="jms" class="org.apache.camel.component.jms.JmsComponent"> <property name="configuration" ref="jmsConfig"/> </bean> <bean id="successProcessor" class="com.test.SuccessTestProcessor"/> <bean id="errorProcessor" class="com.test.ErrorTestProcessor"/> <bean id="deadChannelProcessor" class="com.test.DeadChannelTestProcessor"/> <bean id="myDeadLetterErrorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder"> <property name="deadLetterUri" value="direct:dead_letter_channel"/> <property name="redeliveryPolicy" ref="myRedeliveryPolicyConfig"/> </bean> <bean id="myRedeliveryPolicyConfig" class="org.apache.camel.processor.RedeliveryPolicy"> <property name="maximumRedeliveries" value="0"/> </bean> <camelContext xmlns="http://camel.apache.org/schema/spring" errorHandlerRef="myDeadLetterErrorHandler"> <route id="route-one" > <from uri="jms:queue:t24IFInboundQueue"/> <transacted/> <to uri="direct:success-route"/> <to uri="direct:error-route"/> </route> <route id="direct-success-route"> <from uri="direct:success-route"/> <transacted/> <process ref="successProcessor"/> <to uri="jms:queue:JMS_ONE"/> </route> <route id="direct-error-route"> <from uri="direct:error-route"/> <transacted/> <process ref="errorProcessor"/> <to uri="jms:queue:JMS_TWO"/> </route> <route id="direct_dead_letter_channel"> <from uri="direct:dead_letter_channel"/> <process ref="deadChannelProcessor"/> <to uri="jms:queue:ERROR"/> </route> </camelContext> Thanks!!!