Являются ли события CDI Java EE 6 транзакционными? - PullRequest
13 голосов
/ 19 ноября 2010

Транзакционны ли события Java EE 6 CDI?

Если я инициирую событие в транзакции и затем откату транзакцию, будут ли откатываться эффекты прослушивателя событий?

Зависит ли это поведение от самого слушателя событий, поддерживающего транзакции?

Как быть, если я попытаюсь откатить исключение изнутри прослушивателя событий, откатит ли она транзакцию, вызвавшую событие?

1 Ответ

16 голосов
/ 22 ноября 2010

Из главы событий спецификации CDI 1.0 можно определить событие как «транзакционное», указав TransactionPhase, который наблюдает, где TransactionPhase - одно из:

  • IN_PROGRESS
  • BEFORE_COMPLETION
  • AFTER_COMPLETION
  • AFTER_FAILURE,
  • AFTER_SUCCESS

Такая декларация выглядит так:

void onDocumentUpdate(@Observes(during=AFTER_SUCCESS) @Updated Document doc) { ... }

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

Тем не менее:

Любой метод наблюдателя, вызванный до завершения транзакции, может вызвать setRollbackOnly () для принудительного отката транзакции. Метод наблюдателя не может напрямую инициировать, фиксировать или откатывать транзакции JTA.

Если метод наблюдателя выдает исключение (и сам по себе не является "транзакционным"), то исключение прерывает обработку события.

Итак, чтобы добиться нужного мне поведения, я считаю, что я бы зарегистрировал своего наблюдателя как «транзакционного» и указал BEFORE_COMPLETION TransactionPhase. Затем я бы вызвал setRollbackOnly (), если бы я хотел откатить транзакцию, которая инициировала событие.

...