У нас есть контейнер прослушивателя сообщений JMS Spring для приема асинхронных сообщений. Использование DefaultMessageListenerContainer и в режиме sessionTransacted. Я понимаю, что в режиме sessionTransacted в случае исключения сообщение будет возвращено в очередь. Но как я могу удостовериться, что сообщение не будет удалено из очереди, даже если ресивер (который выбрал сообщение) сработает или просто работает компьютер?Сохранение сообщений в очереди при сбое получателя
Сначала я думал, что режим подтверждения CLIENT_ACKNOWLEDGE должен спасти меня, но apparently это не тот случай, Spring звонки .знание() независимо от того, что.
Итак, вот мой вопрос, как я могу гарантировать доставку? Использование настраиваемого MessageListenerContainer? Использование диспетчера транзакций?
-1, поскольку вывод, сделанный из этого документа, неверен. Да, есть redelivery, если вызов receive() или onMessage() завершается неудачно, но это не означает, что у получателя есть шанс что-то сделать с сообщением. Если ресивер сработает в этот момент, сообщение безвозвратно потеряно, чего пытается избежать OP.Однако использование транзакционного сеанса и явных вызовов фиксации, как описано в другом ответе, предотвращает такую потерю сообщений, если сбой приемника. –
Итак, в двух словах статья вводит в заблуждение? Что означает крах? если метод onMessage не возвращается из-за сбоя, не будет ли сообщение повторно отправлено? – soody
Я не говорю, что статья вводит в заблуждение, просто она не относится к исходному вопросу. Все ошибки, описанные в цитате статьи, происходят до того, как сообщение возвращается в приложение. OP хотел отложить подтверждение сообщения до тех пор, пока сообщение не будет возвращено, и приложение не обработало его, как предполагается, должен предоставить CLIENT_ACKNOWLEDGE. Установка Session.AUTO_ACKNOWLEDGE фактически обеспечивает соблюдение поведения, которое пытается предотвратить OP. –