Spring JMSTemplate, неотправленные сообщения, когда соединение отказано - PullRequest
0 голосов
/ 04 июля 2018

Я столкнулся с проблемами в моей среде JMS.

Я создал JMSTemplate, и он использует ActiveMQSslConnectionFactory (в целях безопасности).

Иногда мой сервер может быть отключен или хост недоступен. В этом случае мой JMSTemplate не может подключиться к хосту, и мое сообщение не будет доставлено из-за этого исключения:

org.springframework.jms.UncategorizedJmsException: Uncategorized exception occurred during JMS processing; nested exception is javax.jms.JMSException: Could not connect to broker URL: ssl://127.0.0.1:61616. Reason: java.net.ConnectException: Connection refused: connect

Существует ли какой-либо ресурс / конфигурация для JMSTemplate или ConnectionFactory для сохранения этих неотправленных сообщений и их повторной отправки при восстановлении соединения?

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Серверы обмена сообщениями, такие как ActiveMQ, следует рассматривать как критически важную инфраструктуру, аналогичную базам данных, и их следует настраивать с настройкой нескольких серверов / HA, чтобы избежать простоев сервера любой ценой. Однако есть несколько способов смягчить случай простоя. Как буферизация внутренних событий в BlockingQueue или аналогичном. Этот сценарий будет по-прежнему вызывать потерю сообщения, если приложение будет перезапущено во время простоя ActiveMQ. Чтобы быть уверенным, что никакие данные не будут потеряны, каждое событие должно быть сохранено в базе данных (которая также может быть недоступна) или во встроенном ActiveMQ, тесно связанном с приложением.

Рабочий подход может состоять в том, чтобы настроить привязанный (встроенный) ActiveMQ приложения и сделать так, чтобы приложение записало в него, а затем настроить «Сеть посредников» для удаленного ActiveMQ. Таким образом, приложение всегда будет читать / записывать в локальный ActiveMQ, и сообщения будут передаваться, когда оба экземпляра будут подключены. Это будет работать только до тех пор, пока локально будет свободное дисковое пространство, поэтому вам все еще нужно знать, что делать, когда дерьмо попадает в вентилятор.

0 голосов
/ 05 июля 2018

Сохранять их где?

Нет; такого механизма нет; вы можете обернуть вызовы JmsTemplate в RetryTemplate из-за повторной попытки, но если вы хотите где-то сохранять сбои, вам нужно будет это реализовать.

...