Отказ транзакции был выполнен при отработке отказа, однако фиксация могла быть успешной - PullRequest
0 голосов
/ 27 марта 2019

У меня есть приложение, использующее jms, которое отправляет данные в очередь ActiveMQ Artemis.Я получил исключение с этим сообщением:

Транзакция была отменена при отработке отказа, однако фиксация могла быть успешной

Это исключение в основном говорит мне, что сообщение может иливозможно, не достиг очереди, поэтому я не знаю, нужно ли мне снова отправить сообщение.Какой лучший способ обработать исключение, подобное этому, когда:

  1. Я не могу отправить дубликаты сообщений приложениям на другом конце очереди.

и

Я не могу пропустить сообщение.

1 Ответ

1 голос
/ 27 марта 2019

Я не могу изложить это лучше, чем документация ActiveMQ Artemis :

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

Если целевой сервер или соединение не удалось после того, как отправка была получена и обработана, но до того, как ответ был отправлен обратно, то сообщение будет успешно отправлено на адрес, но если целевой сервер или соединение не удалось до того, как отправка была получена иПосле завершения обработки он не будет успешно отправлен на адрес.С точки зрения отправителя, невозможно различить эти два случая.

Когда сервер восстанавливается, клиент оказывается в сложной ситуации.Он знает, что на целевом сервере произошел сбой, но не знает, достигло ли последнее сообщение своего места назначения.Если он решит повторно отправить последнее сообщение, это может привести к отправке дубликата сообщения на адрес.Если каждое сообщение было ордером или сделкой, это может привести к тому, что ордер будет выполнен дважды или сделка будет дважды забронирована.Это явно нежелательная ситуация.

Отправка сообщений в транзакции также не помогает.Если во время обработки подтверждения транзакции происходит сбой сервера или соединения, также не определено, была ли транзакция успешно принята или нет!

Для решения этих проблем Apache ActiveMQ Artemis обеспечивает автоматическое обнаружение дубликатов сообщений, отправляемых на адреса.

Подробнее о настройке и использовании обнаружения дубликатов см. В документации ActiveMQ Artemis .

...