2010-11-19 27 views
11

Les événements Java EE 6 CDI sont-ils transactionnels?Les événements Java EE 6 CDI sont-ils transactionnels?

Si je déclenche un événement dans une transaction et annule la transaction, les effets de l'écouteur d'événement sont-ils également restaurés?

Ce comportement dépend-il de la prise en charge des transactions par l'écouteur d'événements lui-même?

Que se passe-t-il si j'essaie de restaurer l'exception depuis l'écouteur de l'événement interne, annule-t-elle la transaction qui a déclenché l'événement?

+0

code? (15chrs.) – Bozho

+0

Un exemple de code concis des producteurs et auditeurs d'événements CDI est disponible sur: http://www.adam-bien.com/roller/abien/entry/java_ee_6_observer_with –

Répondre

15

De l'events chapter de la spécification CDI 1,0, on peut définir un événement pour être « transactionnel » en spécifiant le TransactionPhase une est l'observation, où TransactionPhase est l'un de:

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

Une telle déclaration ressemble à:

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

Si l'observateur a déclaré être « transactionnel », le conteneur appelle immédiatement l'observateur, sinon il enregistre la méthode d'observation pour l'appel plus tard lors de l'achèvement de la transaction phase, en utilisant une synchronisation JTA.

Cependant:

Toute méthode d'observation appelé avant la fin d'une transaction peut appeler setRollbackOnly() pour forcer un rollback de la transaction. Une méthode d'observation ne peut pas initier, valider ou restaurer directement des transactions JTA.

Si la méthode de l'observateur déclenche une exception (et n'est pas elle-même "transactionnelle"), l'exception interrompt le traitement de l'événement. Donc, pour obtenir le comportement que je recherche, je crois que je devrais enregistrer mon observateur comme "transactionnel", et spécifier le BEFORE_COMPLETION TransactionPhase. J'appellerais alors setRollbackOnly() si je voulais annuler la transaction qui a initié l'événement.