Вопрос

Являются ли Java EE 6 CDI Events Transactional?

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

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

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

Это было полезно?

Решение

От События глава Спецификации CDI 1.0 можно определить событие, чтобы быть «транзакционным», указывая, что наблюдается, что транзакционная фаза наблюдается, когда транзакционная фаза является одним из:

  • В ХОДЕ ВЫПОЛНЕНИЯ,
  • До_completion,
  • ПОСЛЕ ЗАВЕРШЕНИЯ,
  • Allow_failure,
  • After_success.

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

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

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

Однако:

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

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

Итак, для достижения поведения я ищу, я полагаю, что я бы зарегистрировал свой наблюдатель как «транзакционный», и укажите транзазазакзацию From_Completion. Я бы тогда позвонил SetRollbackonly (), если я хотел откатить транзакцию, которая инициировала событие.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top