I'm configuring my route (jms queue A -> some processing -> jms queue
B) to be transactional. My route looks like:
<bean id="required" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
<property name="transactionManager" ref="txManager" />
<property name="propagationBehaviorName" value="PROPAGATION_REQUIRED" />
</bean>
<route>
<from uri="activemq://queue-a" />
<transacted ref="required"/>
<process ref="myProcessor" />
<from uri="activemq://queue-a" />
</route>
connection factories etc. configuration at the end of this post. I
followed examples from Camel In Action chapter 9.
I test that my transactions work as:
1. modified myProcessor so that it takes a long time (Thread.sleep(1000000))
2. send message to queue-a
3. while message is being processed by myProcessor, kill servicemix
(and camel inside)
4. check if the message exists in the queue-a or if it has been lost
When I have the <transacted ref="required"/> there, it works as I
expect it, message stays in the ActiveMQ pending messages.
But when I remove <transacted ref="required"/> the route still seems
to be transactional and the message is not lost. Why is that? Can I
just forget <transacted/> in all of my routes? ActiveMQComponent bean
has definition <property name="transacted" value="true" />, is this
the cause?
ActiveMQ / JMS definitions:
<bean id="activemq"
class="org.apache.activemq.camel.component.ActiveMQComponent">
<property name="transacted" value="true" />
<property name="transactionManager" ref="txManager" />
<property name="connectionFactory" ref="jmsConnectionFactory" />
</bean>
<bean id="txManager"
class="org.springframework.jms.connection.JmsTransactionManager">
<property name="connectionFactory" ref="jmsConnectionFactory" />
</bean>
<bean id="jmsConnectionFactory"
class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="${activemq.brokerurl}" />
</bean>