生产者线程在ActiveMQConnection.ensureConnectionInfoSent()

时间:2018-03-22 11:48:07

标签: activemq

我有一个ThreadPoolExecutor,它运行一个worker来将消息发布到ActiveMQ 5.15.3。

每个工作程序都尝试从PooledConnectionFactory获取连接。然后尝试在队列上发布消息。

**我不确定为什么messagePool上的几乎所有线程都会在createSession调用中被阻止? **

enter image description here

我在下面添加了线程转储:

  

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)

1 个答案:

答案 0 :(得分:1)

当客户端配置为使用基于故障转移传输的URI并且远程代理不存在,或者您提供了错误的地址等时,会发生这种情况。客户端尚未连接并且正在等待初始连接成立。您可以设置选项以控制在报告故障之前进行的尝试次数,但是在这种情况下,池将继续尝试建立新连接以替换失败的那个,因此真正的解决方案是解决客户端的原因无法连接。