Что происходит в очереди JMS, когда onMessage () генерирует JMSException? - PullRequest
14 голосов
/ 07 апреля 2010

Я использую Spring 2.5 с моим пользовательским классом, который реализует MessageListener. Если в моем методе onMessage () создается исключение JmsException, что происходит с состоянием очереди?

Является ли сообщение "доставленным" в очередь в момент вызова onMessage? Или JmsException вызывает некоторый откат, и сообщение повторно вводится в очередь?

Заранее спасибо!

1 Ответ

15 голосов
/ 08 апреля 2010

Из спецификации JMS 1.1 ...

4.5.2 Асинхронная доставка

Клиент может зарегистрировать объект, реализующий интерфейс JMS MessageListener, с помощью MessageConsumer. Когда сообщения поступают для потребителя, поставщик доставляет их, вызывая метод onMessage слушателя.

Слушатель может вызвать исключение RuntimeException; однако это считается ошибкой программирования клиента. Слушатели с хорошим поведением должны перехватывать такие исключения и пытаться перенаправить сообщения, вызывающие их, в какую-либо форму назначения «необработанного сообщения» для конкретного приложения.

Результат того, что слушатель выбрасывает RuntimeException, зависит от режима подтверждения сеанса.

  • AUTO_ACKNOWLEDGE или DUPS_OK_ACKNOWLEDGE - сообщение будет немедленно доставлено. сколько раз провайдер JMS будет повторно доставить то же сообщение перед сдача зависит от поставщика. JMSRedelivered поле заголовка сообщения будет установлено сообщение доставлено при этих обстоятельствах.
  • CLIENT_ACKNOWLEDGE - следующее сообщение для слушателя доставлено. Если клиент хочет иметь предыдущий неподтвержденное сообщение доставлено, он должен восстановить сеанс вручную.
  • Transacted Session - следующее сообщение для слушателя доставлено. клиент может либо зафиксировать, либо откатить сеанс (другими словами, RuntimeException не автоматически откатить сессию).

Поставщики JMS должны помечать клиентов прослушивателями сообщений, которые выдают Возможные исключения RuntimeException:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...