以下代码试图使用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。
答案 0 :(得分:2)
将org.apache.activemq.ActiveMQMessageProducer
变量(由堆栈跟踪顶部的closed
方法检查)的代码checkClosed()
初始化为false
必须将其设置为true
才能引发此异常。从我看到的内容来看,只有在生产者本身,原始会话或原始连接关闭时,才将其设置为true
。由于某些其他故障,连接和/或会话很可能在后台关闭,并且生产者的异常是该问题的第一个明显症状。
在任何情况下,如果没有至少一些有关代码的详细信息,或者理想情况下没有minimal, reproducible example,就不可能得出可靠的结论。