Description
Jason Harris opened SPR-7558 and commented
The new commitIfNecessary call to reset transaction timeout only happens in Spring JMS's AbstractPollingMessageListenerContainer.doReceiveAndExecute and when no message was received. This can cause a deadlock when integrated with Tibco JMS API and a prefetch value of NONE is set on the Queue. Workaround is to set a non-NONE prefetch value (.e.g. 1 or 5).Deadlocked pair of threads example below:
"MessagePublisherContainer-1" prio=10 tid=0x0899c400 nid=0x6d56 in Object.wait() [0x77074000..0x770750b0]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at com.tibco.tibjms.TibjmsxLink.sendRequest(TibjmsxLink.java:320)
- locked <0x94443d68> (a com.tibco.tibjms.TibjmsxResponse)
at com.tibco.tibjms.TibjmsxSessionImp._confirmTransacted(TibjmsxSessionImp.java:2817)
at com.tibco.tibjms.TibjmsxSessionImp._confirm(TibjmsxSessionImp.java:3213) - locked <0x8f656fd0> (a java.lang.Object)
at com.tibco.tibjms.TibjmsxSessionImp._commit(TibjmsxSessionImp.java:2501)
at com.tibco.tibjms.TibjmsxSessionImp.commit(TibjmsxSessionImp.java:4361)
at sun.reflect.GeneratedMethodAccessor108.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.jms.connection.CachingConnectionFactory$CachedSessionInvocationHandler.invoke(CachingConnectionFactory.java:344)
at $Proxy57.commit(Unknown Source)
at org.springframework.jms.support.JmsUtils.commitIfNecessary(JmsUtils.java:217)
at org.springframework.jms.listener.AbstractMessageListenerContainer.commitIfNecessary(AbstractMessageListenerContainer.java:575)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:354)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:261)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1056)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1048)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:947)
at java.lang.Thread.run(Thread.java:619)
"TIBCO EMS TCPLink Reader (724129)" daemon prio=10 tid=0x08754000 nid=0x6d55 waiting for monitor entry [0x766b6000..0x766b7030]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.tibco.tibjms.TibjmsxSessionImp._stopConsumerReceive(TibjmsxSessionImp.java:578)
- waiting to lock <0x8f656fd0> (a java.lang.Object)
at com.tibco.tibjms.TibjmsxSessionImp._postMessage(TibjmsxSessionImp.java:1704) - locked <0x8f656fc8> (a java.lang.Object)
at com.tibco.tibjms.TibjmsConnection._processDataMessage(TibjmsConnection.java:2611)
at com.tibco.tibjms.TibjmsConnection._processMessage(TibjmsConnection.java:2414)
at com.tibco.tibjms.TibjmsxLinkTcp$LinkReader.work(TibjmsxLinkTcp.java:288)
at com.tibco.tibjms.TibjmsxLinkTcp$LinkReader.run(TibjmsxLinkTcp.java:250)
Affects: 3.0.4
Issue Links:
- JMS integration with Tibco causes deadlock due to commitIfNecessary in AbstractPollingMessageListenerContainer [SPR-11642] #16265 JMS integration with Tibco causes deadlock due to commitIfNecessary in AbstractPollingMessageListenerContainer
- AbstractPollingMessageListenerContainer's workaround for Tibco causes performance delays during ems failover [SPR-14697] #19261 AbstractPollingMessageListenerContainer's workaround for Tibco causes performance delays during ems failover
- DefaultMessageListenerContainer transacted session race condition if no messages for a while when using shared/cached sessions [SPR-7366] #12024 DefaultMessageListenerContainer transacted session race condition if no messages for a while when using shared/cached sessions
Referenced from: commits 6d94c92
Activity
spring-projects-issues commentedon Oct 1, 2010
Juergen Hoeller commented
I've addressed this through a specific Tibco check where we'll simply skip the no-message-received commit then. As far as we're aware, Tibco doesn't require such resetting of the transaction timeout in any case.
Juergen