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 of over 48,000 articles and solutions.
Welcome! Check out the Getting Started with Red Hat page for quick tours and guides for common tasks.
