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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top