JMS - производитель закрыт - PullRequest
0 голосов
/ 25 сентября 2019

Следующий код пытается отправить сообщение в очередь с помощью 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 Ответ

2 голосов
/ 25 сентября 2019

При просмотре кода для org.apache.activemq.ActiveMQMessageProducer переменная closed (которая проверяется методом checkClosed() в верхней части трассировки стека) инициализируется как false, поэтому что-то еще должно быть установлено вtrue для этого исключения.Из того, что я вижу, установлено значение true только когда сам производитель, исходный сеанс или исходное соединение закрыты.Возможно, что соединение и / или сеанс закрываются в фоновом режиме из-за какого-то другого сбоя, и это исключение для производителя является первым видимым признаком этой проблемы.

В любом случае, без каких-либо дополнительных подробностей о вашем коде или, в идеале, минимального воспроизводимого примера на самом деле невозможно сделать надежный вывод.

...