Cambio de las aplicaciones al comportamiento setRollbackOnly "específico de la versión" de WebSphere
Utilice esta tarea para permitir que las aplicaciones posteriores a EJB 3.0 muestren un comportamiento anterior a EJB 3.0 y para permitir que las aplicaciones anteriores a EJB 3.0 muestren un comportamiento posterior a EJB 3.0. Los pasos de esta tarea que proporcionan este comportamiento de proceso se basan en un escenario de proceso muy específico, que se describe en la sección Acerca de esta tarea.
Acerca de esta tarea
Escenario de proceso: la base de esta tarea es el siguiente escenario de proceso.
Se invoca un método EJB que inicia una transacción global. Dentro de la ejecución de este método, se invoca otro método EJB que sigue ejecutándose dentro de la misma transacción. Durante la ejecución de este método, se invoca el método setRollbackOnly(). El comportamiento del contenedor de EJBcuando se encuentra este escenario se rige por la especificación EJB. Sin embargo, este comportamiento era necesario para cambiar en WebSphere Application Server para el soporte de EJB.
La sección 13.6.2.8 del documento JSR 220: Enterprise JavaBeans™, Version 3.0 EJB Core Contracts and Requirements, así como las versiones anteriores de la especificación EJB, indica que
"Si el contenedor ha iniciado la transacción inmediatamente antes de asignar el método de empresa a la instancia (en contraposición de la transacción que se hereda del emisor), el contenedor debe tener en cuenta que la instancia ha invocado el método setRollbackOnly. Cuando se completa la invocación del método de empresa, el contenedor se debe retrotraer en lugar de confirmar la transacción. Si el método de empresa ha devuelto unos valores normales o con una excepción de aplicación, el contenedor debe pasar el resultado del método o la excepción de la aplicación al cliente después de que el contenedor haya realizado la retrotracción)". Además la sección 14.3.11 indica: "Sin embargo, el contenedor no debe lanzar la javax.ejb.EJBException o java.rmi.RemoteException o si el contenedor realiza una retrotracción de transacción porque la instancia ha invocado el método setRollbackOnly en su objeto EJBContext. En este caso, el contenedor debe retrotraer la transacción y pasar el resultado del método de empresa o la excepción de la aplicación lanzada por el método de empresa en el cliente".
Históricamente, WebSphere Application Server ha interpretado las secciones anteriores de la especificación para dictar que el comportamiento setRollbackOnly sólo se debe aplicar si la transacción se había marcado como RollbackOnly dentro del método que inició la transacción. Sin embargo, la Suite de prueba de compatibilidad para la especificación EJB 3.0 requiere que una transacción marcada como RollbackOnly muestre el comportamiento setRollbackOnly anterior, independientemente de si la transacción se ha marcado como RollbackOnly dentro del método que ha iniciado la transacción, o dentro de otro método dentro de la misma transacción que se ha invocado desde el método EJB original.
- Una aplicación invoca un método, art, en EJB Un soporte de transacción gestionada por el contenedor, TX_REQUIRED.
- El contenedor inicia una transacción e invoca el método.
- El método A.art() invoca un método, bob, en EJB B con el soporte de transacción gestionada por el contenedor, TX_REQUIRED.
- Dentro de B.bob(), el método setRollbackOnly se invoca en la transacción y, a continuación, finaliza.
Comportamiento anterior a EJB 3.0: puesto que la transacción no se ha iniciado con el método B.bob(), se lanza una TranactionRolledbackException en A.art() y, finalmente, en la aplicación cliente.
Comportamiento introducido en EJB 3.0 y posterior: el método B.bob() ha devuelto unos resultados normales al método A.art(). El método A.art() realiza una retrotracción en la transacción y devuelve los resultados al cliente sin ninguna excepción lanzada en la aplicación cliente, tal como se indica a través de la especificación EJB.
- com.ibm.websphere.ejbcontainer.limitSetRollbackOnlyBehaviorToInstanceFor: esta propiedad permite al usuario especificar los nombres de aplicaciones en que desean que los EJB en sus módulos EJB 3.0 muestren el comportamiento de setRollbackOnly anterior a EJB 3.0 descrito anteriormente en esta sección.
- com.ibm.websphere.ejbcontainer.extendSetRollbackOnlyBehaviorBeyondInstanceFor : Esta propiedad permite al usuario especificar los nombres de aplicación en los que desean que los EJB en sus módulos previos a EJB 3.0 demuestren el comportamiento de EJB 3.0 setRollbackOnly descrito anteriormente en esta sección.