deadlock on com.swiftmq.tools.concurrent.Semaphore?
Hello,
we are using JBoss 4.0.5, Spring Framework 2.5.3 and SwiftMQ 6.2.1. We do not use org.springframework.jms.core.JmsTemplate because of the performance issues. I know that SwiftMQ 7.3 offers com.swiftmq.jms.springsupport.SingleSharedConnectionFactory - we do not use that. When using XA transactions with large objects (many aggregated messages processed together), this happens sometimes:
WARN [TransactionImpl] XAException: tx=TransactionImpl:XidImpl[FormatId=257, GlobalId=someserver.somedomain/580977207/153, BranchQual=, localId=153] errorCode=XA_UNKNOWN(0)
javax.transaction.xa.XAException: Request time out (70000) ms!
at com.swiftmq.jms.v610.XAResourceImpl.end(Unknown Source)
at org.jboss.tm.TransactionImpl$Resource.endResource(TransactionImpl.java:2143)
at org.jboss.tm.TransactionImpl$Resource.endResource(TransactionImpl.java:2118)
at org.jboss.tm.TransactionImpl.endResources(TransactionImpl.java:1462)
at org.jboss.tm.TransactionImpl.beforePrepare(TransactionImpl.java:1116)
at org.jboss.tm.TransactionImpl.commit(TransactionImpl.java:324)
at org.jboss.tm.TxManager.commit(TxManager.java:240)
at org.springframework.transaction.jta.UserTransactionAdapter.commit(UserTransactionAdapter.java:76)
at org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1028)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:709)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:678)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
This is a part of the thread dump few moments before the exception occured:
"Thread_aoEngine_2" prio=1 tid=0xa6847240 nid=0x1465 in Object.wait() [0xa5357000..0xa5357eb0]
at java.lang.Object.wait(Native Method)
- waiting on <0xb3d78f58> (a com.swiftmq.tools.concurrent.Semaphore)
at java.lang.Object.wait(Object.java:474)
at com.swiftmq.tools.util.UninterruptableWaiter.doWait(Unknown Source)
at com.swiftmq.tools.concurrent.Semaphore.waitHere(Unknown Source)
- locked <0xb3d78f58> (a com.swiftmq.tools.concurrent.Semaphore)
at com.swiftmq.tools.requestreply.RequestRegistry.request(Unknown Source)
at com.swiftmq.jms.v610.SessionImpl.requestBlockable(Unknown Source)
at com.swiftmq.jms.v610.XASessionImpl.request(Unknown Source)
at com.swiftmq.jms.v610.XAResourceImpl.end(Unknown Source)
- locked <0xb24decf0> (a com.swiftmq.jms.v610.XAResourceImpl)
at org.jboss.tm.TransactionImpl$Resource.endResource(TransactionImpl.java:2143)
at org.jboss.tm.TransactionImpl$Resource.endResource(TransactionImpl.java:2118)
at org.jboss.tm.TransactionImpl.endResources(TransactionImpl.java:1462)
at org.jboss.tm.TransactionImpl.beforePrepare(TransactionImpl.java:1116)
at org.jboss.tm.TransactionImpl.commit(TransactionImpl.java:324)
at org.jboss.tm.TxManager.commit(TxManager.java:240)
at org.springframework.transaction.jta.UserTransactionAdapter.commit(UserTransactionAdapter.java:76)
at org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1028)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:709)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:678)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
When we use smaller objects in the XA transactions, this error did not happen yet. Is there anything we could do to prevent this behaviour? I have no idea when, why and which thread is supposed to call notify on that com.swiftmq.tools.concurrent.Semaphore.
Thanks in advance for any hints.
Leoš Bitto