Правильное место, чтобы вызвать stop () для MessageListeners и временно приостановить доставку входящих сообщений соединением (JMSCC0012 ..)?

Как я вижу в спецификации JMS, connection.stop () не может быть вызван из onMessage () для асинхронного MessageListener. Не могли бы вы посоветовать подходящее место для вызова connection.stop (), чтобы приостановить доставку входящих сообщений и не получить исключение: "JMSCC0012: метод stop ()" может не работать вызывается из прослушивателя сообщений. " и автоматически возобновляет соединение после некоторого события? Каковы лучшие практики использования connection.stop ()?

Из спецификации JMS 2.0:

6.1.5. Приостановка доставки входящих сообщений Если при вызове stop запущены какие-либо прослушиватели сообщений, stop должен дождаться, пока все они не вернутся, прежде чем он сможет вернуться. Пока эти прослушиватели сообщений завершают свою работу, им должны быть доступны все службы подключения. Слушатель сообщений не должен пытаться разорвать собственное соединение, так как это может привести к тупиковой ситуации. Провайдер JMS должен обнаружить это и выбросить исключение javax.jms.IllegalStateException.

Из jms 1.1:

4.3.4 Приостановка доставки входящих сообщений Если MessageListeners запущены при вызове stop, stop должен дождаться, пока все они не вернутся, прежде чем он сможет вернуться. Пока эти MessageListeners завершают свою работу, им должны быть доступны все службы соединения.


person yaroslavpalamar    schedule 30.01.2018    source источник


Ответы (1)


В моем случае решение заключалось в установке volatile boolean переменной suspendConnection из onMessage(). И проверьте эту переменную из другого потока, который анализирует сообщения. Когда переменная suspendConnection была установлена ​​внутри onMessage(), я вызываю connection.stop() из потока парсера.

person yaroslavpalamar    schedule 01.02.2018