Sono eventi Java EE 6 CDI transazionale?
-
26-09-2019 - |
Domanda
Gli eventi sono Java EE 6 CDI transazionale?
Se io generare un evento in una transazione, e, successivamente, il rollback della transazione, sono gli effetti del listener di eventi rollback come bene?
E 'questo comportamento dipende l'ascoltatore evento stesso sostenendo le transazioni?
Che dire se provo e roll-back l'eccezione dall'interno poi listener di eventi, lo fa roll-back della transazione che ha generato l'evento?
Soluzione
eventi capitolo della specifica CDI 1.0, si può definire un evento per essere "transazionale" specificando il TransactionPhase uno sta osservando, dove TransactionPhase è uno dei seguenti:
- in_progress,
- BEFORE_COMPLETION,
- AFTER_COMPLETION,
- AFTER_FAILURE,
- AFTER_SUCCESS
Un tale aspetto dichiarazione del tipo:
void onDocumentUpdate(@Observes(during=AFTER_SUCCESS) @Updated Document doc) { ... }
Qualora l'osservatore non è dichiarato essere "transazionale", allora il contenitore chiama l'osservatore subito, altrimenti si registra il metodo osservatore invocazione successivamente durante la fase di completamento dell'operazione, utilizzando una sincronizzazione JTA.
Tuttavia:
Qualsiasi metodo osservatore chiamato prima del completamento di una transazione può chiamare setRollbackOnly () per forzare un rollback della transazione. Un metodo osservatore non può direttamente avviare, commit o rollback le transazioni JTA.
Se il metodo osservatore genera un'eccezione (ed è di per sé non "transazionale") le Aborts eccezione di elaborazione della manifestazione.
Quindi, per ottenere il comportamento che sto cercando, credo avrei registrare il mio osservatore come "transazionale", e specificare il BEFORE_COMPLETION TransactionPhase. Vorrei quindi chiamare setRollbackOnly () se volevo rollback della transazione che ha avviato l'evento.