2016-02-23 4 views
2

Я знаю, что есть много вопросов о message driven beans и транзакциях, однако я не смог найти ответ на (как мне кажется) общий сценарий.Ведомые ведомые бобы и транзакции

У меня есть служба, которую можно вызвать для отправки электронной почты. Когда он вызывается, он создает запись электронной почты в таблице и затем подталкивает идентификатор к ActiveMQ для обработки. Пока все хорошо, но очередь выбирает идентификатор и пытается отправить электронное письмо до совершения транзакции, а электронная почта не является в базе данных.

Служба сама по себе является транзакционной, но она также может быть частью более крупной транзакции.

Каков наилучший способ справиться с этим сценарием? Я использую Thread.sleep в данный момент в Consumer, который работает; Однако это чувствует себя грязным ...

(я не использую Spring)

+0

это сервис EJB и кто звонит в эту службу? –

+0

Это сервис CDI (ApplicationScoped) и будет вызываться из любой другой службы CDI. Транзакции - это DeltaSpike (к сожалению, я не могу использовать функцию '@ Observes' TransactionPhase ... JavaEE). – StuPointerException

+0

, если у вас есть поддержка XA, вы можете попробовать с XADatasource и XAConnectionFactory.Or, поскольку TT предложил отправить сообщение в очередь из класса, который вызывает службу ur после вызова службы возврата. –

ответ

1

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

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

+0

Я пытаюсь избежать запланированной работы, знаете ли вы где-нибудь еще, что я могу подключиться к жизненному циклу транзакции, чтобы отключить это сообщение (в идеале оно должно быть прозрачным от вызывающего)? Я думал об использовании JPA-событий, но они находятся внутри одной транзакции ... – StuPointerException

+0

@StuPointerException Отправить сообщение в очередь в конце транзакции. Потребитель будет посылать сообщение для отправки писем. Разве это не сработает? Тогда потребительский процесс не будет выполняться в транзакции. –

+0

Спасибо за помощь в этом, проблема, с которой я столкнулась, - это знать, когда Tx был совершен, поскольку он уже запущен при вызове метода службы. Это желательно, поскольку это означает, что электронная почта эффективно откатывается, если вызывающий метод выдает исключение. – StuPointerException

0

Возможно, сделать флеш сразу после сохранения почты поможет?

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

+0

Спасибо за предложение, однако я стараюсь, чтобы избежать сохранения записи электронной почты, если клиент выдает исключение. Я просто не могу заглянуть в жизненный цикл транзакции, чтобы узнать, что происходит с указанной транзакцией! – StuPointerException