Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Incomplete
-
5.9.1
-
None
-
None
Description
When connecting to the broker, the client occasionally starts to hang. A thread dump reveals:
"QuartzScheduler_Worker-7" prio=5 tid=0x0116f190 nid=0x1ce2400 waiting on condition [0xf1fae000..0xf1fafb30] at sun.misc.Unsafe.park(Native Method) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:118) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1767) at java.util.concurrent.ArrayBlockingQueue.take(ArrayBlockingQueue.java:341) at org.apache.activemq.transport.FutureResponse.getResult(FutureResponse.java:40) at org.apache.activemq.transport.ResponseCorrelator.request(ResponseCorrelator.java:80) at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1233) at org.apache.activemq.ActiveMQConnection.ensureConnectionInfoSent(ActiveMQConnection.java:1339) - locked <0x10b9bdf8> (a java.lang.Object) at org.apache.activemq.ActiveMQConnection.createSession(ActiveMQConnection.java:298) at org.jencks.amqpool.SessionPool.createSession(SessionPool.java:110) at org.jencks.amqpool.SessionPool.makeObject(SessionPool.java:78) at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:974) at org.jencks.amqpool.SessionPool.borrowSession(SessionPool.java:53) at org.jencks.amqpool.ConnectionPool.createSession(ConnectionPool.java:89) at org.jencks.amqpool.XaConnectionPool.createSession(XaConnectionPool.java:51) at org.jencks.amqpool.PooledConnection.createSession(PooledConnection.java:132) at org.springframework.jms.support.JmsAccessor.createSession(JmsAccessor.java:200)
Looking closer at the code of ensureConnectionInfoSent in ActiveMQConnection, it uses the method:
public Response syncSendPacket(Command command) throws JMSException {
which never times out, possibly causing everything to hang eternally. There does seem to be an identical method that allows for a timeout.
public Response syncSendPacket(Command command, int timeout) throws JMSException {
should / can ensureConnectionInfoSent use the one with the timeout instead?
We're using the failover transport:
failover:(tcp://<someIP>:54663?wireFormat.maxInactivityDuration=300000)?maxReconnectAttempts=10&initialReconnectDelay=15000