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

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

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

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

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

а также

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

person b15    schedule 26.03.2019    source источник


Ответы (1)


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

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

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

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

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

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

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

person Justin Bertram    schedule 26.03.2019