[ 
https://issues.apache.org/jira/browse/CAMEL-10873?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Daniele Fognini updated CAMEL-10873:
------------------------------------
    Attachment: TransactedAsyncExceptionTest.java

> camel-sjms transacted routes dead-lock when exceptions are thrown by 
> asynchronous processors
> --------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-10873
>                 URL: https://issues.apache.org/jira/browse/CAMEL-10873
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-sjms
>    Affects Versions: 2.18.2, 2.19.0
>            Reporter: Daniele Fognini
>         Attachments: TransactedAsyncExceptionTest.java
>
>
> SJMS Consumers attempt rollback of the JMS Session if an exception is thrown 
> along the Camel route. The rollback is attempted where the exception occurs 
> and not on the original synchronous pipeline.
> For example with ActiveMQ and the thread component (see attached unit test)
> {code:java}
> AtomicInteger counter = new AtomicInteger();
> from(destination + "?acknowledgementMode=SESSION_TRANSACTED&transacted=true")
>    .threads()
>    .process(exchange -> {
>       if (counter.incrementAndGet() < TRANSACTION_REDELIVERY_COUNT) {
>           throw new IllegalArgumentException();
>       }
>     })
>     .to("mock:async.exception")
> {code}
> `Session.rollback()` must be called by the ActiveMQ Thread, but is attempted 
> by the asynchronous Camel thread, resulting in a dead-lock:
> {noformat}
> "Camel (camel-1) thread #0 - Threads" Id=26 BLOCKED on 
> java.lang.Object@4b9df8a owned by "ActiveMQ Session Task-1" Id=22
>     
> org.apache.activemq.ActiveMQMessageConsumer.rollback(ActiveMQMessageConsumer.java:1212)
>     
> org.apache.activemq.ActiveMQMessageConsumer$5.afterRollback(ActiveMQMessageConsumer.java:1091)
>     
> org.apache.activemq.TransactionContext.afterRollback(TransactionContext.java:162)
>     
> org.apache.activemq.TransactionContext.rollback(TransactionContext.java:287)
>     org.apache.activemq.ActiveMQSession.rollback(ActiveMQSession.java:603)
>     
> org.apache.camel.component.sjms.tx.SessionTransactionSynchronization.onFailure(SessionTransactionSynchronization.java:54)
>     
> org.apache.camel.util.UnitOfWorkHelper.doneSynchronizations(UnitOfWorkHelper.java:101)
>     org.apache.camel.impl.DefaultUnitOfWork.done(DefaultUnitOfWork.java:234)
>     org.apache.camel.util.UnitOfWorkHelper.doneUow(UnitOfWorkHelper.java:65)
>     
> org.apache.camel.processor.CamelInternalProcessor$UnitOfWorkProcessorAdvice.after(CamelInternalProcessor.java:675)
>     
> org.apache.camel.processor.CamelInternalProcessor$UnitOfWorkProcessorAdvice.after(CamelInternalProcessor.java:630)
>     
> org.apache.camel.processor.CamelInternalProcessor$InternalCallback.done(CamelInternalProcessor.java:247)
>     
> org.apache.camel.processor.CamelInternalProcessor$InternalCallback.done(CamelInternalProcessor.java:258)
>     
> org.apache.camel.processor.RedeliveryErrorHandler$2.done(RedeliveryErrorHandler.java:553)
>     org.apache.camel.processor.Pipeline$1.done(Pipeline.java:147)
>     
> org.apache.camel.processor.ThreadsProcessor$ProcessCall.run(ThreadsProcessor.java:87)
>     java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
>     java.util.concurrent.FutureTask.run(FutureTask.java:266)
>     
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
>     
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
>     java.lang.Thread.run(Thread.java:745)
> "ActiveMQ Session Task-1" Id=22 WAITING on 
> java.util.concurrent.CountDownLatch$Sync@6955cb39
>     sun.misc.Unsafe.park(Native Method)
>     java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
>     
> java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
>     
> java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997)
>     
> java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304)
>     java.util.concurrent.CountDownLatch.await(CountDownLatch.java:231)
>     
> org.apache.camel.impl.DefaultAsyncProcessorAwaitManager.await(DefaultAsyncProcessorAwaitManager.java:75)
>     
> org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:105)
>     
> org.apache.camel.component.sjms.consumer.InOnlyMessageHandler.handleMessage(InOnlyMessageHandler.java:65)
>     
> org.apache.camel.component.sjms.consumer.AbstractMessageHandler.onMessage(AbstractMessageHandler.java:89)
>     
> org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1401)
>     
> org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
>     
> org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
>     
> org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
>     
> org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
>     
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
>     
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
>     java.lang.Thread.run(Thread.java:745)
> {noformat}



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to