2013-10-06 5 views
3

У нас есть то, что мы считаем, что это довольно распространенное использование XA случае ошибки:EJBs, XA сделки и обработки

  1. прочитал сообщение от в-очереди
  2. запись данных в базу данных
  3. записи ответное сообщение в очередь (отличное от очереди)

Однако нам также нужен способ обработки внутренних ошибок и ядовитых сообщений. Поток управления мы имеем в виду что-то вроде этого:

  1. прочитал сообщение от в-очереди
  2. записи в базу данных
    • если есть исключения откат транзакции базы данных
    • если не существует исключения, запустите commit phase1 в базе данных
  3. если все прошло нормально (нет отката и фиксации фазы 1 нормально), напишите сообщение об успешном завершении в очередь
  4. Если произошла сбой фазы фиксации 1 в базе данных или возникло исключение, а транзакция базы данных была откатна, напишите сообщение об ошибке в очередь
  5. : в очереди, в очереди и в базе данных (за исключением отката из-за исключения)

Это хороший подход, должны ли мы делать это по-другому? Как мы можем это сделать с EJB?

Мы используем EJB 3.1 на JBoss AS 7.2/EAP 6.1, кодирование против Narayana напрямую является вариантом. Драйвер JDBC - ojdbc7-12.1.0.1, а JMS RAR - серия MQ (не знаю версию).

+0

Это радикально изменит протокол XA, не так ли? И я уверен, что вы не сможете этого сделать. Почему бы вам просто не настроить JMS-провайдера, чтобы позволить слушателю сообщения потреблять сообщение N раз и отправлять сообщение в очередь ошибок, если все попытки N потерпели неудачу? –

+0

Я рассматриваю как разновидность вложенной транзакции. Да, я знаю, что JTA не поддерживает вложенные транзакции, но это крайний случай, когда самому ресурсу не нужно поддерживать вложенные транзакции, а только менеджер транзакций (Narayana AFAIK делает). –

+0

Ум, как бы вы зафиксировали базу данных как на шаге 2, так и на шаге 5?что будет для шага 5? Не могли бы вы просто использовать стандартную распределенную транзакцию, чтобы все было совершено на шаге 5, и если какой-либо из них терпит неудачу, весь процесс откатывается и вы отправляете сообщение об ошибке в очередь? – eis

ответ

2

Что вы можете сделать, это использовать механизм событий Java EE для получения уведомления при сбое транзакции и создания последующего выходного сообщения.

См

Вы должны использовать новую транзакцию для записи в из очереди, чтобы избежать отбрасывания сообщения писать, а ,

У вас по-прежнему будет сообщение во входной очереди, которое вызвало исключение, так как откат предотвратит успешное потребление. Вы должны обрабатывать это отдельно, например, поставщиком JMS.

Смежные вопросы