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.