Jonathan Beales created QPIDJMS-446:
---------------------------------------

             Summary: Deadlock during receiveMessage when broker connecton fails
                 Key: QPIDJMS-446
                 URL: https://issues.apache.org/jira/browse/QPIDJMS-446
             Project: Qpid JMS
          Issue Type: Bug
          Components: qpid-jms-client
         Environment: * Java 1.8.0_20, 1.8.0_192, & 1.8.0_172
 * Linux 4.9.0-4-amd64 & 3.10.0-327.13
 * qpidd 1.39.0
            Reporter: Jonathan Beales
         Attachments: qpid_jms_deaklock.patch

When a JMS MessageConsumer calls receiveMessage with a timeout, if no message 
is received during the timeout, BasicMessageConsumer_0_10.getMessageFromQueue() 
calls the syncDispatchQueue() method.  As not the dispatcher thread, the 
consumer waits on a method local CountDownLatch which should be decremented 
when the AMQSession.Dispatcher thread calls dispatch().

In the AMQSession.Dispatcher thread, the core loop will stop pulling from the 
queue to dispatch messages when the connection to the broker is lost 
(isClosing() becomes true).

In this scenario, the receiveMessage call is waiting forever because the 
Dispatcher will never call dispatch.  This also leaves the Dispatcher thread in 
an infinite loop (using 100% CPU) waiting to be fully closed.

This can fixed by allowing the AMQSession.Dispatcher to always dispatch 
remaining queue content to ensure a consumer is not waiting forever (see 
attached).



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to