Hi Antonin

So I created a branch which attempts to use Narayana.
https://github.com/garyhodgson/camel-example-cdi-standalone-jta/tree/narayana

I see the arjuna transaction manager starts up but the logs seem to
indicate too little interaction with the activemq connection factory I
think, and the results are not as I expect (the logs end with "middle
QueueSize = 2" where it should only be one).  I've posted the output of the
camel:run command in the off-chance anyone wants to take a look:
https://gist.github.com/garyhodgson/c96bc6c90656c5f1a2af21f95caacf9f

I'll look forward to any examples you get around to makeing - hopefully
they will help show me where I'm going wrong.

Cheers,
Gary

On 28 November 2017 at 18:00, Antonin Stefanutti <anto...@stefanutti.fr>
wrote:

> Hi Gary,
>
> Would that be possible for you to test with anther transaction
> implementation?
>
> IIRC I add some issues with Atomikos and then switch to JBoss JTA /
> Narayana and it worked.
>
> I plan to add a Camel CDI / JMS / JTA example ASAP which should cover that.
>
> Antonin
>
> > On 28 Nov 2017, at 00:25, Gary Hodgson <gary.s.hodg...@gmail.com> wrote:
> >
> > Scratch that - setting
> > the activeMQConfiguration.setUseSingleConnection(true) causes
> everything to
> > run in the same thread and the problem still occurs.
> >
> > On 27 November 2017 at 23:59, Gary Hodgson <gary.s.hodg...@gmail.com>
> wrote:
> >
> >> Hi
> >>
> >> So after a hiatus I got time to look at this problem again.  From
> delving
> >> into the atomikos code and the trace logs I believe the issue lies in
> >> threading.  As shown in the logs below the atomikos jms factory bean
> >> appears to correctly create a composite transaction on the camel
> >> JmsConsumer thread. However the jms session requesting the transaction
> is
> >> running on the main thread and cannot find it.  (The composite
> transaction
> >> managers appear to be stored in a map keyed by thread).
> >>
> >> I realise this is quite a specific problem which the majority of people
> >> avoid by (sensibly) running camel-cdi and jta in wildfly, but if anyone
> has
> >> experience or ideas on how to make camel and atomikos find each other
> here
> >> it would be most appreciated.  I'll also have a go with Narayana whether
> >> that yields more success.
> >>
> >> Transaction created on this thread...
> >>
> >>  [Camel (camel-1) thread #1 - JmsConsumer[start]] DEBUG
> >> com.atomikos.icatch.imp.CompositeTransactionManagerImp -
> >> createCompositeTransaction ( 10000 ): created new ROOT transaction with
> id
> >> 10.0.75.1.tm151182109511700001
> >>  [Camel (camel-1) thread #1 - JmsConsumer[start]] DEBUG
> com.atomikos.jms.AtomikosConnectionFactoryBean
> >> - AtomikosConnectionFactoryBean 'xamq': createConnection()...
> >>  [Camel (camel-1) thread #1 - JmsConsumer[start]] INFO com.atomikos.jms.
> AtomikosConnectionFactoryBean
> >> - AtomikosConnectionFactoryBean 'xamq': init...
> >>  [Camel (camel-1) thread #1 - JmsConsumer[start]] TRACE
> >> com.atomikos.icatch.imp.CompositeTransactionManagerImp -
> >> getCompositeTransaction()  returning instance with id
> >> 10.0.75.1.tm151182109511700001
> >>  [Camel (camel-1) thread #1 - JmsConsumer[start]] TRACE
> >> com.atomikos.datasource.pool.ConnectionPool - atomikos connection pool
> >> 'xamq': about to wait for connection during 30000ms...
> >>  [main] TRACE com.atomikos.datasource.xa.session.SessionHandleState - a
> >> SessionHandleState with 0 context(s): notifySessionBorrowed
> >>  [main] TRACE com.atomikos.datasource.xa.session.TransactionContext - a
> >> TransactionContext: changing to state com.atomikos.datasource.xa.
> session.
> >> NotInBranchStateHandler@a826ff8
> >>  [main] DEBUG com.atomikos.jms.AtomikosJmsXaSessionProxy - atomikos xa
> >> session proxy for resource xamq: calling toString on JMS driver
> session...
> >>  [main] TRACE com.atomikos.jms.AtomikosJmsXaSessionProxy - atomikos xa
> >> session proxy for resource xamq: toString returning ActiveMQSession
> >> {id=ID:garyhodgson-PC-57091-1511821093820-1:1:2,started=false}
> >> java.lang.Object@63187d63
> >>  [main] TRACE com.atomikos.jms.AtomikosJmsConnectionProxy - atomikos
> >> connection proxy for resource xamq: returning ActiveMQSession
> >> {id=ID:garyhodgson-PC-57091-1511821093820-1:1:2,started=false}
> >> java.lang.Object@63187d63
> >>  [main] DEBUG com.atomikos.jms.AtomikosJmsXaSessionProxy - atomikos xa
> >> session proxy for resource xamq: calling createQueue on JMS driver
> >> session...
> >>  [main] TRACE com.atomikos.jms.AtomikosJmsXaSessionProxy - atomikos xa
> >> session proxy for resource xamq: createQueue returning queue://start
> >>  [main] DEBUG com.atomikos.jms.AtomikosJmsXaSessionProxy - atomikos xa
> >> session proxy for resource xamq: calling createProducer on JMS driver
> >> session ActiveMQSession {id=ID:garyhodgson-PC-57091-
> >> 1511821093820-1:1:2,started=false} java.lang.Object@63187d63
> >>  [main] TRACE com.atomikos.jms.AtomikosJmsXaSessionProxy - atomikos xa
> >> session proxy for resource xamq: createProducer returning atomikos
> >> MessageProducer proxy for ActiveMQMessageProducer {
> >> value=ID:garyhodgson-PC-57091-1511821093820-1:1:2:1 }
> >>  [main] DEBUG com.atomikos.jms.AtomikosJmsXaSessionProxy - atomikos xa
> >> session proxy for resource xamq: calling createTextMessage on JMS driver
> >> session...
> >>  [main] TRACE com.atomikos.jms.AtomikosJmsXaSessionProxy - atomikos xa
> >> session proxy for resource xamq: createTextMessage returning
> >> ActiveMQTextMessage {commandId = 0, responseRequired = false, messageId
> =
> >> null, originalDestination = null, originalTransactionId = null,
> producerId
> >> = null, destination = null, transactionId = null, expiration = 0,
> timestamp
> >> = 0, arrival = 0, brokerInTime = 0, brokerOutTime = 0, correlationId =
> >> null, replyTo = null, persistent = false, type = null, priority = 0,
> >> groupID = null, groupSequence = 0, targetConsumerId = null, compressed =
> >> false, userID = null, content = null, marshalledProperties = null,
> >> dataStructure = null, redeliveryCounter = 0, size = 0, properties =
> null,
> >> readOnlyProperties = false, readOnlyBody = false, droppable = false,
> >> jmsXGroupFirstForConsumer = false, text = null}
> >>  [main] DEBUG com.atomikos.jms.AtomikosJmsMessageProducerProxy -
> >> atomikos MessageProducer proxy for ActiveMQMessageProducer {
> >> value=ID:garyhodgson-PC-57091-1511821093820-1:1:2:1 }: send ( message
> )...
> >>
> >> Attempt to get transaction here...
> >>
> >>  [main] TRACE com.atomikos.icatch.imp.CompositeTransactionManagerImp -
> >> getCompositeTransaction() returning NULL!
> >>  [main] WARN com.atomikos.jms.ConsumerProducerSupport - atomikos
> >> MessageProducer proxy for ActiveMQMessageProducer {
> >> value=ID:garyhodgson-PC-57091-1511821093820-1:1:2:1 }: 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.
> >>
> >>
> >> Cheers,
> >> Gary
> >>
> >>
> >> On 6 November 2017 at 18:16, Gary Hodgson <gary.s.hodg...@gmail.com>
> >> wrote:
> >>
> >>> Hi Antonin.
> >>>
> >>> Thanks for the response.
> >>>
> >>> I attempted a naive implementation of TransactionServices and it
> appears
> >>> to load via the serviceloader correctly, and produce UserTransactions:
> >>> https://github.com/garyhodgson/camel-example-cdi-standalone-
> >>> jta/blob/TransactionServices/src/main/java/org/apache/
> >>> camel/example/cdi/util/TransactionServices.java
> >>>
> >>> Sadly the AtomikosTransactionRequiredJMSException is still thrown.
> >>>
> >>>
> >>> On 6 November 2017 at 11:52, Antonin Stefanutti <anto...@stefanutti.fr
> >
> >>> wrote:
> >>>
> >>>> 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.AtomikosTrans
> >>>> actionRequiredJMSException:
> >>>>> 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.thr
> >>>> owAtomikosTransactionRequiredJMSException(AtomikosTransactio
> >>>> nRequiredJMSException.java:23)
> >>>>> ~[transactions-jms-4.0.4.jar:?]
> >>>>>     at
> >>>>> com.atomikos.jms.ConsumerProducerSupport.enlist(ConsumerProd
> >>>> ucerSupport.java:90)
> >>>>> ~[transactions-jms-4.0.4.jar:?]
> >>>>>     at
> >>>>> com.atomikos.jms.AtomikosJmsMessageProducerProxy.send(Atomik
> >>>> osJmsMessageProducerProxy.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$CamelJmsTemp
> >>>> late.doSend(JmsConfiguration.java:624)
> >>>>> ~[camel-jms-2.20.0.jar:2.20.0]
> >>>>>     at
> >>>>> org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemp
> >>>> late.doSendToDestination(JmsConfiguration.java:563)
> >>>>> ~[camel-jms-2.20.0.jar:2.20.0]
> >>>>>     at
> >>>>> org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemp
> >>>> late.access$100(JmsConfiguration.java:505)
> >>>>> ~[camel-jms-2.20.0.jar:2.20.0]
> >>>>>     at
> >>>>> org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemp
> >>>> late$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$CamelJmsTemp
> >>>> late.send(JmsConfiguration.java:516)
> >>>>> ~[camel-jms-2.20.0.jar:2.20.0]
> >>>>>     at
> >>>>> org.apache.camel.component.jms.JmsProducer.doSend(JmsProduce
> >>>> r.java:440)
> >>>>> ~[camel-jms-2.20.0.jar:2.20.0]
> >>>>>     at
> >>>>> org.apache.camel.component.jms.JmsProducer.processInOnly(Jms
> >>>> Producer.java:394)
> >>>>> ~[camel-jms-2.20.0.jar:2.20.0]
> >>>>>     at
> >>>>> org.apache.camel.component.jms.JmsProducer.process(JmsProduc
> >>>> er.java:157)
> >>>>> ~[camel-jms-2.20.0.jar:2.20.0]
> >>>>>     at
> >>>>> org.apache.camel.processor.SharedCamelInternalProcessor.proc
> >>>> ess(SharedCamelInternalProcessor.java:186)
> >>>>> ~[camel-core-2.20.0.jar:2.20.0]
> >>>>>     at
> >>>>> org.apache.camel.processor.SharedCamelInternalProcessor.proc
> >>>> ess(SharedCamelInternalProcessor.java:86)
> >>>>> ~[camel-core-2.20.0.jar:2.20.0]
> >>>>>     at
> >>>>> org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerC
> >>>> ache.java:541)
> >>>>> ~[camel-core-2.20.0.jar:2.20.0]
> >>>>>     at
> >>>>> org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerC
> >>>> ache.java:506)
> >>>>> ~[camel-core-2.20.0.jar:2.20.0]
> >>>>>     at
> >>>>> org.apache.camel.impl.ProducerCache.doInProducer(ProducerCac
> >>>> he.java:369)
> >>>>> ~[camel-core-2.20.0.jar:2.20.0]
> >>>>>     at
> >>>>> org.apache.camel.impl.ProducerCache.sendExchange(ProducerCac
> >>>> he.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(DefaultPr
> >>>> oducerTemplate.java:144)
> >>>>> ~[camel-core-2.20.0.jar:2.20.0]
> >>>>>     at
> >>>>> org.apache.camel.impl.DefaultProducerTemplate.sendBody(Defau
> >>>> ltProducerTemplate.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.ResourceInjectReplacementExten
> sion)
> >>>> 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