13.3. Contenedor de transacciones administradas
En casos en los que JBoss BPM Suite está incorporado dentro de una aplicación que es un contenedor que puede administrar transacciones por sí mismo (Transacción manejada por contenedor - CMT), se proporciona un gestor de transacciones dedicado mediante la clase
org.jbpm.persistence.jta.ContainerManagerTransactionManager. Esto se debe a que la implementación predeterminada del gestor de transacciones en JBoss BPM Suite se basa en la clase UserTransaction para obtener el estatus de transacciones. Sin embargo, algunos servidores de aplicaciones en un modo CMT no permiten el acceso a la instancia UserTransaction desde JNDI.
Las operaciones ejecutadas en este gestor no son operativas (no-op) debido a que no pueden afectar la CMT subyacente. La clase
ContainerManagedTransactionManager espera que la transacción esté siempre activa (retornando ACTIVE al método getStatus()).
Nota
Aunque el contenedor maneja las transacciones, el contenedor debería conocer las excepciones que se producen durante la ejecución de la instancia del proceso. Las excepciones enviadas por el motor deben propagarse hasta que el contenedor puede restaurar las transacciones correctamente.
Configuración del gestor de transacciones
Para configurar y usar
ContainerManagedTransactionManager, se debe insertar en el entorno antes de crear o cargar una sesión:
Environment env = EnvironmentFactory.newEnvironment();
env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf);
env.set(EnvironmentName.TRANSACTION_MANAGER, new ContainerManagedTransactionManager());
env.set(EnvironmentName.PERSISTENCE_CONTEXT_MANAGER, new JpaProcessPersistenceContextManager(env));
Luego configure el proveedor JPA en su archivo
persistence.xml . Por ejemplo, si utiliza IBM WebSphere:
<property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.CMTTransactionFactory"/> <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.WebSphereExtendedJTATransactionLookup"/>
Disposición de KSession en un CMT
En una CMT, no debe disponer de ksession directamente (al usar el método
dispose()). Al hacerlo, causará excepciones al completar la transacción ya que el motor del proceso necesita limpiar el estado después de que la invocación haya terminado.
En su lugar, use el método
org.jbpm.persistence.jta.ContainerManagedTransactionDisposeCommand's execute() method. Using this command ensures that the ksession will be disposed when the transaction is actually complete.
Este método verifica si la transacción está activa. Si lo está, delega la fase
afterDisposal de la transacción en lugar de ejecutarla directamente. Si no hay ninguna transacción activa, ksession se suprimirá inmediatamente.