Могу ли я зарегистрировать прослушиватель в MessageConsumer, а затем вызвать метод receive()? (JMS)

Мне было интересно, могу ли я зарегистрировать слушателя в MessageConsumer, а затем вызвать метод receive(). Я знаю, что это не похоже на практический сценарий, но было бы интересно узнать. Спецификация JMS допускает что-то подобное?

Я знаю, что сеанс является однопоточным контекстом, и отправка сообщений его слушателями будет последовательной, но, как я могу себе представить, поток, который фактически обрабатывает моих зарегистрированных слушателей, будет делать это, и это должен быть какой-то поток, который JMS провайдер создает. Это означает, что поток, создавший потребителя сообщений, является отдельным и может одновременно прослушивать сообщения. Верно ли то, что я только что сказал? Что происходит в этом сценарии?


person Bat0u89    schedule 19.05.2016    source источник


Ответы (2)


Насколько я знаю, ваш сценарий не описан в спецификации JMS. Так что остается реализовать JMS. Например, в случае IBM MQ вызов получения после подключения прослушивателя сообщений вызовет исключение с кодом возврата MQRC_HCONN_ASYNC_ACTIVE.

person Shashi    schedule 19.05.2016

Ваш анализ проблемы с потоками — это именно то, о чем я думаю. Я думаю, у вас проблемы из-за того, что 2 потока взаимодействуют с одним сеансом.

Хорошо, я посмотрел это в спецификации JMS 1.1. Два бита говорят об этом, когда я читаю это.

  1. 4.5 - «Клиент может либо синхронно получать сообщения потребителя, либо асинхронно доставлять их поставщику по мере их поступления». Либо/или, а не оба.
  2. 4.4.6 — «Для клиента ошибочно использовать поток управления для попытки синхронного получения сообщения, если уже существует клиентский поток управления, ожидающий получения сообщения в том же сеансе». Я думаю, что прослушиватель сообщений — это другой поток, уже ожидающий получения в том же сеансе.
person John M    schedule 19.05.2016