Pregunta

Los eventos son Java EE 6 CDI transaccional?

Si desencadenar un evento en una transacción, y posteriormente deshacer la transacción, son los efectos del detector de eventos deshace así?

depende este comportamiento en el propio detector de eventos apoyar las transacciones?

¿Qué pasa si lo intento y retroceso excepción desde dentro continuación, detector de eventos, lo hace retroceso de la transacción que generó el evento?

¿Fue útil?

Solución

Desde el eventos capítulo de la especificación CDI 1.0, uno puede definir un evento para ser "transaccional" especificando el TransactionPhase uno está observando, donde TransactionPhase es uno de:

  • IN_PROGRESS,
  • BEFORE_COMPLETION,
  • AFTER_COMPLETION,
  • AFTER_FAILURE,
  • AFTER_SUCCESS

Esta declaración se ve así:

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

Si el observador no se declara ser "transaccional", entonces el contenedor llama el observador de inmediato, de lo contrario registra el método de observador para la invocación más tarde durante la fase de finalización de la transacción, utilizando un JTA sincronización.

Sin embargo:

  

Cualquier método de observador llamado antes de la finalización de una transacción pueden llamar setRollbackOnly () para forzar una operación de deshacer la transacción. Un método de observador no puede iniciar directamente, cometer o transacciones JTA reversión.

Si el método de observador produce una excepción (y es en sí misma no "transaccional") los aborta excepción de procesamiento del evento.

Por lo tanto, para lograr el comportamiento que estoy buscando, creo que me gustaría registrar mi observador como "transaccional", y especifique la BEFORE_COMPLETION TransactionPhase. Entonces yo llame setRollbackOnly () si quería deshacer la transacción que inició el evento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top