Подтвердить что ты не робот

Являются ли события Java EE 6 CDI транзакционными?

Являются ли события Java EE 6 CDI транзакционными?

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

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

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

4b9b3361

Ответ 1

В разделе событий спецификации 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(), если я хотел отменить транзакцию, инициировавшую событие.