JMS-生产者已关闭

时间:2019-09-25 16:53:01

标签: jms activemq

以下代码试图使用JMS在队列上发送消息。

connection = jmsConnectionFactory.createConnection();
connection.start();

session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue(queueName);

MessageProducer producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.PERSISTENT);

它在大多数情况下都有效,但是在运行压力测试时,并行发送了许多消息,我发现以下例外:

Caused by: javax.jms.IllegalStateException: The producer is closed
        at org.apache.activemq.ActiveMQMessageProducer.checkClosed(ActiveMQMessageProducer.java:195)
        at org.apache.activemq.ActiveMQMessageProducerSupport.setDeliveryMode(ActiveMQMessageProducerSupport.java:136)

setDeliveryMode()中引发了异常。 我曾见过其他有关同一问题的文章,但就我而言,我既没有使用共享会话,也没有共享连接。

我正在运行ActiveMQ 5.14.5。

1 个答案:

答案 0 :(得分:2)

org.apache.activemq.ActiveMQMessageProducer变量(由堆栈跟踪顶部的closed方法检查)的代码checkClosed()初始化为false必须将其设置为true才能引发此异常。从我看到的内容来看,只有在生产者本身,原始会话或原始连接关闭时,才将其设置为true。由于某些其他故障,连接和/或会话很可能在后台关闭,并且生产者的异常是该问题的第一个明显症状。

在任何情况下,如果没有至少一些有关代码的详细信息,或者理想情况下没有minimal, reproducible example,就不可能得出可靠的结论。