Hi, I am trying to get camel-cdi to work with a standalone JTA provider in a non-JEE environment. I've made some progress but have a couple of issues which I am not sure is due to my understanding or the code.
I created a standalone demo project here to show the issues: https://github.com/garyhodgson/camel-example-cdi-standalone-jta The demo uses Atomikos as the JTA provider and embedded ActiveMQ for JMS. Running the project with camel:run results in three messages being sent to the route. The first two are called explicitly in a userTransaction and behave as expected: the first is processed normally, the second triggers a rollback (as expected). The third message is outside a userTransaction and throws the following exception from Atomikos: Caused by: com.atomikos.jms.AtomikosTransactionRequiredJMSException: The JMS session you are using requires a JTA transaction context for the calling thread and none was found. Please correct your code to do one of the following: 1. start a JTA transaction if you want your JMS operations to be subject to JTA commit/rollback, or 2. increase the maxPoolSize of the AtomikosConnectionFactoryBean to avoid transaction timeout while waiting for a connection, or 3. create a non-transacted session and do session acknowledgment yourself, or 4. set localTransactionMode to true so connection-level commit/rollback are enabled. at com.atomikos.jms.AtomikosTransactionRequiredJMSException.throwAtomikosTransactionRequiredJMSException(AtomikosTransactionRequiredJMSException.java:23) ~[transactions-jms-4.0.4.jar:?] at com.atomikos.jms.ConsumerProducerSupport.enlist(ConsumerProducerSupport.java:90) ~[transactions-jms-4.0.4.jar:?] at com.atomikos.jms.AtomikosJmsMessageProducerProxy.send(AtomikosJmsMessageProducerProxy.java:34) ~[transactions-jms-4.0.4.jar:?] at org.springframework.jms.core.JmsTemplate.doSend(JmsTemplate.java:626) ~[spring-jms-4.3.11.RELEASE.jar:4.3.11.RELEASE] at org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate.doSend(JmsConfiguration.java:624) ~[camel-jms-2.20.0.jar:2.20.0] at org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate.doSendToDestination(JmsConfiguration.java:563) ~[camel-jms-2.20.0.jar:2.20.0] at org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate.access$100(JmsConfiguration.java:505) ~[camel-jms-2.20.0.jar:2.20.0] at org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate$1.doInJms(JmsConfiguration.java:519) ~[camel-jms-2.20.0.jar:2.20.0] at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:484) ~[spring-jms-4.3.11.RELEASE.jar:4.3.11.RELEASE] at org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate.send(JmsConfiguration.java:516) ~[camel-jms-2.20.0.jar:2.20.0] at org.apache.camel.component.jms.JmsProducer.doSend(JmsProducer.java:440) ~[camel-jms-2.20.0.jar:2.20.0] at org.apache.camel.component.jms.JmsProducer.processInOnly(JmsProducer.java:394) ~[camel-jms-2.20.0.jar:2.20.0] at org.apache.camel.component.jms.JmsProducer.process(JmsProducer.java:157) ~[camel-jms-2.20.0.jar:2.20.0] at org.apache.camel.processor.SharedCamelInternalProcessor.process(SharedCamelInternalProcessor.java:186) ~[camel-core-2.20.0.jar:2.20.0] at org.apache.camel.processor.SharedCamelInternalProcessor.process(SharedCamelInternalProcessor.java:86) ~[camel-core-2.20.0.jar:2.20.0] at org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:541) ~[camel-core-2.20.0.jar:2.20.0] at org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:506) ~[camel-core-2.20.0.jar:2.20.0] at org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:369) ~[camel-core-2.20.0.jar:2.20.0] at org.apache.camel.impl.ProducerCache.sendExchange(ProducerCache.java:506) ~[camel-core-2.20.0.jar:2.20.0] at org.apache.camel.impl.ProducerCache.send(ProducerCache.java:229) ~[camel-core-2.20.0.jar:2.20.0] at org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:144) ~[camel-core-2.20.0.jar:2.20.0] at org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:161) ~[camel-core-2.20.0.jar:2.20.0] ... 56 more I expected that "transacted()" on the route to have caused a transaction to be created, and I am not sure why it has not been - other than it having something to do with this example running outside of a JEE Application Server. Is my expectation here incorrect? I believe the various required beans have been correctly configured as Producer methods under org.apache.camel.example.cdi.util.CdiProducers As an aside: in order to get this working in a Weld SE environment I use a CDI extension (org.apache.camel.example.cdi.util.ResourceInjectReplacementExtension) to add an @Inject annotation to the transactionManager attribute in org.apache.camel.cdi.transaction.JtaTransactionPolicy. Perhaps it would be worth considering adding the annotation in camel-cdi to enable it to be used in a SE environment? (though I don't know if this would adversely affect the JEE world.) Any insights would be appreciated. Cheers, Gary