Desde el events chapter de la especificación CDI 1.0, se 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
Tal declaración parece:
void onDocumentUpdate(@Observes(during=AFTER_SUCCESS) @Updated Document doc) { ... }
Si el observador no se declara como "transaccional", entonces el contenedor llama al observador de inmediato, de lo contrario se registra el método de observador para la invocación más tarde, durante la realización de transacciones fase, utilizando una sincronización JTA.
Sin embargo:
Cualquier método 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 observación no puede iniciar, comprometer o revertir directamente las transacciones de JTA.
Si el método del observador arroja una excepción (y no es en sí "transaccional"), la excepción cancela el procesamiento del evento.
Por lo tanto, para lograr el comportamiento que estoy buscando, creo que registraría mi observador como "transaccional", y especifico BEFORE_COMPLETION TransactionPhase. Luego, llamaría a setRollbackOnly() si quería deshacer la transacción que inició el evento.
código? (15chrs.) – Bozho
Un ejemplo de código conciso de productores y oyentes de eventos de CDI está disponible en: http://www.adam-bien.com/roller/abien/entry/java_ee_6_observer_with –