Changement des applications en comportement WebSphere setRollbackOnly "spécifique à la version"
Utilisez cette tâche afin de permettre aux applications post-EJB 3.0 de quitter le comportement pre-EJB 3.0 et aux applications pre-EJB 3.0 de quitter le comportement post-EJB 3.0. Les étapes de cette tâche qui permettent d'obtenir ce comportement de processus sont basées sur un scénario de traitement spécifique décrit dans la section A propos de cette tâche.
Pourquoi et quand exécuter cette tâche
Scénario de traitement : la base de cette tâche est le scénario de traitement ci-dessous.
Une méthode EJB est appelée et démarre une transaction globale. Au cours de l'exécution de cette méthode, une autre méthode EJB est appelée et continue de fonctionner dans la même transaction. Au cours de l'exécution de cette méthode, la méthode setRollbackOnly() est appelée. Le comportement du conteneur EJB lorsque ce scénario est détecté est dicté par la spécification EJB. Ce comportement a dû être modifié dans WebSphere Application Server pour permettre le support de la spécification EJB 3.0.
La section 13.6.2.8 du document JSR 220: Enterprise JavaBeans™,Version 3.0 EJB Core Contracts and Requirements, ainsi que les versions précédentes de la spécification EJB, indiquent que
"Si le conteneur a déclenché la transaction immédiatement avant la répartition de la méthode métier dans l'instance (par opposition à la transaction en cours d'héritage à partir de l'appelant), le conteneur doit noter que l'instance a appelé la méthode setRollbackOnly. Une fois l'appel de la méthode métier effectué, le conteneur doit annuler plutôt que valider la transaction. Si la méthode métier a été retournée normalement ou avec une exception d'application, le conteneur doit transmettre le résultat de la méthode ou l'exception d'application au client une fois qu'il a effectué l'annulation." De plus, la section 14.3.11 stipule : "En revanche, le conteneur ne doit pas émettre l'exception javax.ejb.EJBException ou java.rmi.RemoteException sauf si le conteneur effectue une annulation de transaction car l'instance a appelé la méthode setRollbackOnly sur son objet EJBContext. Dans ce cas, le conteneur doit annuler la transaction et transmettre le résultat de la méthode métier ou l'exception d'application émise par la méthode métier au client."
Les concepteurs de WebSphere Application Server ont toujours interprété les sections précédentes de la spécification afin d'indiquer que le comportement setRollbackOnly devait uniquement s'appliquer si la transaction avait été marquée comme RollbackOnly dans la méthode qui avait commencé la transaction. Cependant, Compatibility Test Suite pour la spécification EJB 3.0 implique qu'une transaction marquée comme RollbackOnly présente le comportement setRollbackOnly indiqué, que la transaction ait été marquée comme RollbackOnly dans la méthode commençant la transaction ou dans une autre méthode de la même transaction appelée par la méthode EJB d'origine.
- Une application appelle une méthode art sur EJB A avec la pris en charge de Container Managed Transaction, TX_REQUIRED.
- Le conteneur commence une transaction et appelle la méthode.
- La méthode A.art() appelle une méthode bob sur EJB B avec la prise en charge de Container Managed Transaction, TX_REQUIRED.
- Dans B.bob(), la méthode setRollbackOnly est appelée sur la transaction, puis est exécutée.
Comportement avant EJB 3.0 : Comme la transaction n'est pas lancée avec la méthode B.bob(), une exception TranactionRolledbackException est émise dans A.art() et éventuellement dans l'application client.
Comportement dans EJB 3.0 et au-delà : La méthode B.bob() retourne normalement vers la méthode A.art(). La méthode A.art() effectue une annulation de la transaction et retourne les résultats vers le client sans exception émise vers l'application client, comme indiqué par la spécification EJB.
- com.ibm.websphere.ejbcontainer.limitSetRollbackOnlyBehaviorToInstanceFor : Cette propriété permet à l'utilisateur de spécifier des noms d'application dans lesquels il souhaite que les EJB de leurs modules EJB 3.0 présentent le comportement pre-EJB 3.0 setRollbackOnly décrit précédemment dans cette section.
- com.ibm.websphere.ejbcontainer.extendSetRollbackOnlyBehaviorBeyondInstanceFor : Cette propriété permet à l'utilisateur de spécifier des noms d'application dans lesquels il souhaite que les EJB de leurs modules pre-EJB 3.0 présentent le comportement EJB 3.0 setRollbackOnly décrit précédemment dans cette section.