Откат JMS

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


person bmw0128    schedule 05.02.2009    source источник


Ответы (2)


Вы можете использовать JMS и JTA (Java Transaction API) вместе — см. здесь< /а>. При этом отправка сообщения JMS или потребление полученного сообщения фактически происходит атомарно как часть фиксации транзакции.

Что это значит? Если транзакция терпит неудачу или откатывается, «отправленное» сообщение не уходит, а любые «полученные» сообщения на самом деле не используются. Все обрабатывается за вас вашим поставщиком JMS и JTA.

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

У меня был опыт использования этого (BEA WebLogic 7 с интеграцией BEA WebLogic). Работал, как рекламировалось - «внешний мир» не заметил влияния JMS, который я пробовал, если только транзакция не была успешно завершена.

person John M    schedule 06.02.2009

То, что вы описали, является транзакцией XA. Это позволяет охватывать транзакцию несколькими уровнями, например поставщиком JMS, базой данных или любой другой EIS. Большинство контейнеров можно настроить для использования транзакций как без XA, так и без XA, поэтому проверьте настройки контейнера!

Например, если вы используете JMS с транзакциями XA, возможно следующее.

Start Transaction
      |
   DB Insert
      |
   Send JMS Msg
      |
   More DB Inserts
      | 
   Commit Transaction  <- Only at this point will the database records be inserted and the JMS message sent.

Транзакции XA доступны только в полных контейнерах Java EE, поэтому транзакции XA недоступны в Tomcat.

Удачи!

Карл

person Karl    schedule 16.02.2009
comment
Также учитывайте накладные расходы на производительность: stackoverflow.com/questions/12305900/ - person Vadzim; 06.06.2014