2010-11-19 15 views
11

Gli eventi CDI Java EE 6 sono transazionali?Gli eventi CDI di Java EE 6 sono transazionali?

Se si attiva un evento in una transazione e successivamente si esegue il rollback della transazione, anche gli effetti del listener di eventi vengono annullati?

Questo comportamento dipende dal listener di eventi che supporta le transazioni?

E se provassi a eseguire il rollback dell'eccezione dall'interno del listener di eventi, esegue il rollback della transazione che ha generato l'evento?

+0

? (15 ore) – Bozho

+0

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 –

risposta

15

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