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.
code? (15chrs.) – Bozho
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 –