Calling StatefulKnowledgeSession.dispose() inside a transaction causes java.lang.IllegalStateException
Issue
If I call StatefulKnowledgeSession.dispose() inside an EJB transaction-required method causes java.lang.IllegalStateException
10:52:40,748 WARN [com.arjuna.ats.arjuna] (http-localhost-127.0.0.1-8080-1) ARJUNA012125: TwoPhaseCoordinator.beforeCompletion - failed for SynchronizationImple< 0:ffff7f000001:-77d48dc8:4fd8d322:f, org hibernate engine transaction synchronization internal RegisteredSynchronization 8a5770 >: javax.persistence.PersistenceException: error during managed flush
at org.hibernate.ejb.AbstractEntityManagerImpl$CallbackExceptionMapperImpl.mapManagedFlushFailure(AbstractEntityManagerImpl.java:1490) [hibernate-entitymanager-4.1.3.ER1-redhat-1.jar:4.1.3.ER1-redhat-1]
at org.hibernate.engine.transaction.synchronization.internal.SynchronizationCallbackCoordinatorImpl.beforeCompletion(SynchronizationCallbackCoordinatorImpl.java:109) [hibernate-core-4.1.3.ER1-redhat-1.jar:4.1.3.ER1-redhat-1]
at org.hibernate.engine.transaction.synchronization.internal.RegisteredSynchronization.beforeCompletion(RegisteredSynchronization.java:53) [hibernate-core-4.1.3.ER1-redhat-1.jar:4.1.3.ER1-redhat-1]
at com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:76)
at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:273)
at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:93)
at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:164)
...
Caused by: java.lang.IllegalStateException: Illegal method call. This session was previously disposed.
at org.drools.reteoo.DisposedReteooWorkingMemory.getSessionClock(DisposedReteooWorkingMemory.java:398) [drools-core-5.4.0.Final.jar:5.4.0.Final]
at org.drools.impl.StatefulKnowledgeSessionImpl.getSessionClock(StatefulKnowledgeSessionImpl.java:256) [drools-core-5.4.0.Final.jar:5.4.0.Final]
...
@Stateless
@Named("workFlow")
@Alternative
public class EJBWorkflowManager implements WorkflowManager {
@Inject
@Knowledge
private KnowledgeBase kbase;
@Inject
@JBPMPeristenceFactory
private EntityManagerFactory emf;
private StatefulKnowledgeSession ksession = null;
//@TransactionAttribute(TransactionAttributeType.NEVER)
/* (non-Javadoc)
* @see sg.gov.dsta.jbpm.bean.WorkflowManager#startWorkFlow(java.lang.String, java.lang.Long)
*/
@Override
public int startWorkFlow(String approverId, String requeterId, Long rfxId){
try {
Environment env = KnowledgeBaseFactory.newEnvironment();
env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,emf);
ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );
JPAWorkingMemoryDbLogger logger = new JPAWorkingMemoryDbLogger(ksession);
@SuppressWarnings("deprecation")
CommandBasedWSHumanTaskHandler taskHandler = new CommandBasedWSHumanTaskHandler(ksession);
taskHandler.setConnection("192.168.247.159", 9123);
taskHandler.connect();
ksession.getWorkItemManager().registerWorkItemHandler("Human Task", taskHandler);
Map<String, Object> params = new HashMap<String, Object>();
params.put("rfx_approverid", approverId);
params.put("rfx_requesterid", requeterId);
params.put("rfx_id", rfxId);
ksession.startProcess("com.dsta.dsta2",params);
logger.dispose();
//ksession.dispose(); <--------------------------------------------------------- This causes exception
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ksession.getId();
}
}
Environment
- JBoss Enterprise BRMS
- 5.3.0
- jBPM5
Subscriber exclusive content
A Red Hat subscription provides unlimited access to our knowledgebase, tools, and much more.