我有一个ThreadPoolExecutor,它运行一个worker来将消息发布到ActiveMQ 5.15.3。
每个工作程序都尝试从PooledConnectionFactory获取连接。然后尝试在队列上发布消息。
**我不确定为什么messagePool上的几乎所有线程都会在createSession调用中被阻止? **
我在下面添加了线程转储:
messagePool-1 - threadId:85 - state:BLOCKED 堆栈跟踪 java.lang.Thread.State:BLOCKED at org.apache.activemq.ActiveMQConnection.ensureConnectionInfoSent(ActiveMQConnection.java:1469) - 等待锁定< 69f3e6c8> (一个java.lang.Object)由“messagePool-73”t @ 247拥有 在org.apache.activemq.ActiveMQConnection.createSession(ActiveMQConnection.java:329) 在org.apache.activemq.jms.pool.ConnectionPool.makeSession(ConnectionPool.java:112) 在org.apache.activemq.jms.pool.ConnectionPool $ 1.makeObject(ConnectionPool.java:82) 在org.apache.activemq.jms.pool.ConnectionPool $ 1.makeObject(ConnectionPool.java:78) 在org.apache.commons.pool2.impl.GenericKeyedObjectPool.create(GenericKeyedObjectPool.java:1041) at org.apache.commons.pool2.impl.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:357) at org.apache.commons.pool2.impl.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:279) 在org.apache.activemq.jms.pool.ConnectionPool.createSession(ConnectionPool.java:144) 在org.apache.activemq.jms.pool.PooledConnection.createSession(PooledConnection.java:167) 在com.azuga.jms.producer.AMQProducer.postMessage(AMQProducer.java:112) 在com.azuga.jms.producer.AMQProducer.postMessage(AMQProducer.java:88) 在com.azuga.jms.PostMessagesToAppQueuesWorker.run(PostMessagesToAppQueuesWorker.java:61) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617) 在java.lang.Thread.run(Thread.java:745) 锁定可拥有的同步器: - 已锁定< 27cf6e63> (java.util.concurrent.ThreadPoolExecutor $ Worker)
答案 0 :(得分:1)
当客户端配置为使用基于故障转移传输的URI并且远程代理不存在,或者您提供了错误的地址等时,会发生这种情况。客户端尚未连接并且正在等待初始连接成立。您可以设置选项以控制在报告故障之前进行的尝试次数,但是在这种情况下,池将继续尝试建立新连接以替换失败的那个,因此真正的解决方案是解决客户端的原因无法连接。