Hi Gary,

Your CDI producers for the ActiveMQ component and the transaction manager look 
OK (aside that you would have to destroy the connection factory in a dispose 
method).

However The way you produce the UserTransaction may be problematic. With Weld 
SE, you would typically implement 
org.jboss.weld.transaction.spi.TransactionServices and add it as a Weld service 
before starting the CDI container.

Let me know if that helps.

Antonin

> On 5 Nov 2017, at 21:54, Gary Hodgson <gary.s.hodg...@gmail.com> wrote:
> 
> 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

Reply via email to