Хранение сообщений в очереди в случае сбоя получателя - PullRequest
3 голосов
/ 12 апреля 2010

У нас есть контейнер прослушивателя сообщений Spring JMS для асинхронного приема сообщений. Использование DefaultMessageListenerContainer и в режиме sessionTransacted. Я понимаю, что в режиме sessionTransacted означает, что в случае исключения сообщение будет помещено обратно в очередь. Но как я могу убедиться, что сообщение не будет удалено из очереди, даже если получатель (который выбрал сообщение) выходит из строя или только машина, на которой он работает, теряет питание?

Сначала я подумал, что режим подтверждения CLIENT_ACKNOWLEDGE должен спасти меня, но очевидно это не так, Spring вызывает .acknowledge () независимо от того, что.

Итак, вот мой вопрос, как я могу гарантировать доставку? Используя пользовательский MessageListenerContainer? Используя менеджер транзакций?

Ответы [ 3 ]

1 голос
/ 12 апреля 2010

Используйте транзакционный сеанс и укажите успешную обработку сообщения, вызвав метод commit() класса Session.

Проверьте раздел 19.4.5. Обработка сообщений в транзакциях для конфигурации. (вы можете использовать DefaultMessageListenerContainer). В зависимости от того, что вы делаете с сообщениями, вам может понадобиться менеджер транзакций JTA.

0 голосов
/ 02 марта 2018

Приемник сообщений Spring в режиме Client_Acknowledge подтверждает сообщение, когда клиент вызывает message.acknowledge ().

Однако, если после успешного выполнения сообщения потребитель не находит подтверждения со стороны клиента, Spring предполагает, что выполнение было успешным, и подтверждает сообщение.

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

Слушатель сообщений Spring позволяет только генерировать исключение JMS из слушателя onMessage. Поймав ваше пользовательское исключение и сгенерировав исключение JMS из прослушивателя (после регистрации ошибки для дальнейшего использования), вы сможете повторно доставить сообщение.

0 голосов
/ 17 апреля 2010

или вы можете использовать Session.AUTO_ACKNOWLEDGE с нетранзакционным сеансом, см. Цитату ниже из этой статьи

Сообщение автоматически признал, когда это успешно возвращается из метода receive (). Если получатель использует MessageListener интерфейс, сообщение автоматически признается, когда это успешно возвращается из Метод onMessage (). Если неудача происходит при выполнении receive () метод или метод onMessage (), сообщение автоматически доставляется. Провайдер JMS тщательно управляет доставка сообщений и гарантии семантика однократной доставки.

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