Dal events chapter della specifica CDI 1.0, si può definire un evento per essere "transazionale" specificando il TransactionPhase uno sta osservando, dove TransactionPhase è uno tra:
- in_progress,
- BEFORE_COMPLETION,
- AFTER_COMPLETION,
- AFTER_FAILURE,
- AFTER_SUCCESS
Tale dichiarazione appare come:
void onDocumentUpdate(@Observes(during=AFTER_SUCCESS) @Updated Document doc) { ... }
Qualora l'osservatore non è dichiarato di essere "transazionale", quindi il contenitore chiama immediatamente l'osservatore, altrimenti si registra il metodo di osservazione per l'invocazione più tardi, durante il completamento dell'operazione fase, usando una sincronizzazione JTA.
Tuttavia:
Qualsiasi metodo osservatore chiamato prima del completamento di un'operazione può chiamare setRollbackOnly() per forzare un rollback della transazione. Un metodo observer non può avviare direttamente, eseguire il commit o eseguire il rollback delle transazioni JTA.
Se il metodo observer genera un'eccezione (e di per sé non è "transazionale"), l'eccezione interrompe l'elaborazione dell'evento.
Quindi, per ottenere il comportamento che sto cercando, credo che registrerei il mio osservatore come "transazionale" e specificherò la TransactionFASE BEFORE_COMPLETION. Chiamerei quindi setRollbackOnly() se volessi eseguire il rollback della transazione che ha avviato l'evento.
codice
fonte
2010-11-21 23:32:42
? (15 ore) – Bozho
Un esempio di codice conciso di produttori ed ascoltatori di eventi CDI è disponibile all'indirizzo: http://www.adam-bien.com/roller/abien/entry/java_ee_6_observer_with –