API de actividad empresarial
Utilice la interfaz de programación de aplicaciones (API) de actividad empresarial para crear actividades empresariales y manejadores de compensación para un componente de aplicación y para anotar cronológicamente datos que sean necesarios para compensar una actividad en el caso de una anomalía en la totalidad de la actividad empresarial.
Visión general
InitialContext ctx = new InitialContext();
UserBusinessActivity uba = (UserBusinessActivity) ctx.lookup("java:comp/websphere/UserBusinessActivity");
InitialContext initialContext = new InitialContext();
UserBusinessActivity uba = initialContext.lookup("java:comp/websphere/UserBusinessActivity");
…
String activityId = uba.getId();
if (activityId == null)
// No hay actividad en la hebra
else
// Mensaje saliente de auditoría incluido el ID de actividad
- com.ibm.websphere.wsba.serializable.CompensationHandler, que toma un objeto serializable como parámetro
- com.ibm.websphere.wsba.CompensationHandler, que toma un SDO (Service Data Object) como parámetro
Una aplicación debe registrar una implementación de manejador de compensación que funcione con el tipo de datos de compensación (objeto serializable o SDO) que utiliza la aplicación. Si no hay coincidencia entre el tipo de datos que utiliza el componente de la aplicación y la implementación del manejador de compensación, hay un error.
Durante el proceso normal de aplicación, ésta puede realizar una o más invocaciones de los métodos setCompensationDataImmediate o setCompensationDataAtCommit pasando un objeto serializable o un SDO que represente el estado actual del trabajo realizado.
Cuando finaliza la unidad de trabajo (UOW) subyacente con la que está asociada la actividad empresarial raíz, todos los compensadores registrados se coordinan para finalizar. Durante la finalización, se llama al método compensate o close en el manejador de compensación y se pasan los datos de compensación más recientes anotados cronológicamente por el componente de aplicación como un parámetro. La implementación del manejador de compensación debe entender que los datos se almacenan en el objeto serializable o en el DataObject de SDO. Con estos datos, el manejador de compensación debe ser capaz de determinar la naturaleza del trabajo realizado por el enterprise bean y compensarse o cerrarse de un modo adecuado, por ejemplo, deshaciendo los cambios realizados en las filas de bases de datos en el caso de que se produzca una anomalía en la actividad empresarial. Debe asociar el manejador de compensación con un componente de aplicación utilizando las herramientas de ensamblaje, por ejemplo, Rational Application Developer.
Manejadores de compensación activos e inactivos
La interfaz serializable.CompensationHandler o CompensationHandler se implementa para cualquier componente de aplicación que ejecute código que pueda requerir tareas de compensación dentro de un ámbito de actividad empresarial. Los objetos del manejador de compensación se registran implícitamente con el ámbito de actividad empresarial en el que se ejecuta la aplicación siempre que la aplicación llame a la API UserBusinessActivity API para especificar los datos de compensación. Los manejadores de compensación pueden estar en uno de dos estados, activo o inactivo, en función de si están registrados en una UOW de transacciones. Un manejador de compensación registrado en una UOW transaccional podría estar inactivo inicialmente hasta que la transacción se comprometa, que es cuando el manejador de compensaciones se vuelve activo (consulte la sección siguiente). Un manejador de compensación registrado fuera de una UOW transaccional siempre se activa inmediatamente.
Cuando finaliza una actividad empresarial, sólo controla manejadores de compensación activos. Cualquier manejador de compensación inactivo que esté asociado con la actividad empresarial se descarta y no se controla nunca.
Datos de compensación de registro cronológico
La API de actividad empresarial especifica dos métodos que permiten que la aplicación anote cronológicamente los datos de compensación. Estos datos están disponibles para los manejadores de compensación durante su proceso al terminar la actividad empresarial. La aplicación llama a uno de estos métodos dependiendo de si espera que las transacciones formen parte de la actividad empresarial.
- setCompensationDataAtCommit()
- Llame al método setCompensationDataAtCommit si la aplicación espera una transacción global en la hebra.
- Si una transacción global está presente en la hebra, el objeto CompensationHandler está inicialmente inactivo. Si la transacción global genera una anomalía, retrotrae cualquier trabajo transaccional realizado en el contexto transaccional de un modo atómico y controla la actividad empresarial para compensar otras UOW completadas. El manejador de compensación no necesita verse implicado. Si la transacción global se compromete satisfactoriamente, el manejador de compensación se activa porque requiere compensar el trabajo duradero que se completa mediante la transacción global, ya que de lo contrario la actividad empresarial global genera una anomalía. El método setCompensationDataAtCommit configura la instancia CompensationHandler para realizar esta función de compensación.
- Si una transacción global no está presente cuando se llama al método setCompensationDataAtCommit, el manejador de compensación se activa inmediatamente.
DataObject compensationData = doWorkWhichWouldNeedCompensating(); uba.setCompensationDataAtCommit(compensationData);
- setCompensationDataImmediate()
Llame al método setCompensationDataImmediate si la aplicación no espera una transacción global en la hebra.
El método setCompensationDataImmediate activa una instancia de CompensationHandler inmediatamente, independientemente del contexto de UOW actual en el momento en que se invoca el método. El manejador de compensación siempre puede participar durante la finalización de la actividad global.
El papel del método setCompensationDataImmediate es compensar cualquier trabajo que no sea transaccional, es decir, el trabajo que puede realizarse dentro o fuera de una transacción global pero que no está regido por la transacción. Un ejemplo de este tipo de trabajo es enviar un correo electrónico. El manejador de compensación debe estar activo inmediatamente de modo que si ocurre una anomalía dentro de una actividad empresarial, este trabajo que no es transaccional esté siempre compensado.
Por ejemplo, para un objeto serializable y utilizando la misma instancia de actividad empresarial que en el ejemplo anterior:Serializable compensationData = new MyCompensationData(); uba.setCompensationDataImmediate(compensationData);
Aunque, estos dos métodos de registro cronológico de datos de compensación, si se llaman en el mismo enterprise bean, utilizan la misma clase de manejador de compensación, crean dos instancias separadas de la clase de manejador de compensación durante el tiempo de ejecución. Por lo tanto, las acciones de los métodos se excluyen mutuamente, es decir, la llamada a uno de los métodos no altera temporalmente ningún trabajo realizado por el otro método.
Si ya se ha añadido una instancia de manejador de compensación en la actividad empresarial con uno de estos métodos y, a continuación, se llama al mismo método pasando null como parámetro, esta instancia de manejador de compensación se elimina de la actividad empresarial y no se cierra ni se compensa durante la finalización de la actividad empresarial.
Como se describe previamente, el soporte de actividades empresariales añade una instancia de manejador de compensación a la actividad empresarial cuando el enterprise bean que utiliza la actividad empresarial llama a un método de registro cronológico de datos de compensación por primera vez. Simultáneamente, se toma una instantánea del contexto de aplicación empresarial y se anota cronológicamente con los datos de compensación. Al finalizar la actividad empresarial, todos los manejadores de compensación que se han añadido a la actividad empresarial se dirigen a compensate o close. El código creado en la clase CompensationHandler o serializable.CompensationHandler se ejecutará en el mismo contexto de aplicación empresarial capturado en la instantánea anterior.