Подтвердить что ты не робот

Что происходит в очереди JMS, когда onMessage() генерирует исключение JMSException?

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

Рассчитывается ли сообщение "доставлено" в очередь в момент вызова сообщения? Или JMSException запускает какой-то откат, и сообщение снова вводится в очередь?

Спасибо заранее!

4b9b3361

Ответ 1

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

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

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

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

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

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

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