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