Java EE 6 CDI Eventos são transacionais?
-
26-09-2019 - |
Pergunta
Java EE 6 CDI Eventos são transacionais?
Se eu disparo um evento em uma transação e, posteriormente, reverter a transação, os efeitos do ouvinte do evento também são revertidos?
Esse comportamento depende do próprio ouvinte de transações de suporte?
Que tal se eu tentar e reverter a exceção de dentro de dentro do que o ouvinte, ele revirá a transação que demitiu o evento?
Solução
De Capítulo de eventos Da especificação do CDI 1.0, pode -se definir um evento como "transacional" especificando a fase de transação um está observando, onde a fase de transação é uma de:
- EM ANDAMENTO,
- Antes_completion,
- After_Completion,
- After_failure,
- After_success
Essa declaração se parece:
void onDocumentUpdate(@Observes(during=AFTER_SUCCESS) @Updated Document doc) { ... }
Se o observador não for declarado "transacional", o contêiner chama o observador imediatamente, caso contrário, registra o método do observador para invocação posterior durante a fase de conclusão da transação, usando uma sincronização JTA.
No entanto:
Algum O método do observador chamado antes da conclusão de uma transação pode chamar o setRollbackonly () para forçar uma reversão da transação. Um método do observador pode não iniciar, comprometer ou reverter as transações JTA diretamente.
Se o método do observador lançar uma exceção (e não for "transacional"), a exceção aborta o processamento do evento.
Portanto, para alcançar o comportamento que estou procurando, acredito que registraria meu observador como "transacional" e especificaria a fase de transação antes_compleção. Eu chamaria o setRollbackonly () se quisesse reverter a transação que iniciou o evento.