Получите внешнее Java-приложение, уведомив об изменениях в объектных EJB-компонентах в JBoss AS - PullRequest
1 голос
/ 05 июня 2010

Я пытаюсь подключить внешнее приложение к контейнеру JBoss AS. Внешнее приложение - это приложение Java, которое в настоящее время уведомляется об изменениях в объектах базы данных через тему JMS. Я добавил класс EntityLifecycleListener для всех моих сущностей, которые публикуют сериализованную (и развернутую) копию сущности в теме JMS.

Проблема в том, что эта реализация игнорирует границы транзакций контейнера JBoss. Например, событие @PostUpdate может быть инициировано, генерируя сообщение JMS для этого объекта, но транзакция может быть откатана, в результате чего внешнее приложение получит уведомление о недопустимом изменении и станет unsync'd.

Мне нужно, чтобы мое внешнее приложение уведомлялось только об успешных фиксациях в базе данных, но мне нужно иметь возможность публиковать весь Java POJO во внешнем приложении. Есть ли официальный способ сделать это?

1 Ответ

1 голос
/ 05 июня 2010

Спецификация JPA немного расплывчата в отношении разграничения транзакций и слушателя (§ 3.5.2):

Обратные вызовы PreUpdate и PostUpdate выполняются до и после операций обновления базы данных до данные объекта соответственно.

У меня была похожая ситуация, и, насколько я помню, обратный вызов @PostXxxx иногда выполнялся в правильной транзакции или вообще не выполнялся. Это зависит от того, было ли обновление «промежуточным» сбросом в транзакции или «последним» сбросом перед фиксацией транзакции, и в этом случае обратный вызов происходит после транзакции было зафиксировано (что имеет смысл). 1010 *

Я предлагаю вам попробовать с @PreXxxxx, который всегда должен быть в транзакции. (Кроме того, если я хорошо помню, единственная проблема с @PreXxxx состояла в том, что объекту еще не может быть назначен PK, зависит ли это от проблемы, в зависимости от вашего варианта использования.)

...