[jBPM] - "Entity manager is closed" when using spring defined sessions, and async work item handlers
by Francisco Osorio
Francisco Osorio [https://community.jboss.org/people/fosoriog] created the discussion
""Entity manager is closed" when using spring defined sessions, and async work item handlers"
To view the discussion, visit: https://community.jboss.org/message/749455#749455
--------------------------------------------------------------
I'm receiving the following stacktrace when trying to complete a workitem:
Exception in thread "Thread-1" java.lang.IllegalStateException: *EntityManager is closed*
at org.hibernate.ejb.EntityManagerImpl.getSession(EntityManagerImpl.java:66)
at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:182)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:365)
at $Proxy17.find(Unknown Source)
at org.drools.persistence.jpa.JpaPersistenceContext.findWorkItemInfo(JpaPersistenceContext.java:41)
at org.drools.persistence.jpa.processinstance.JPAWorkItemManager.completeWorkItem(JPAWorkItemManager.java:110)
at com.sample.test.AsyncWorkItemHandler$1.run(AsyncWorkItemHandler.java:21)
at java.lang.Thread.run(Thread.java:662)
I've created a minimal workflow and code that reproduces this problem. Here is my session definition:
h2. session.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:drools-spring="http://drools.org/schema/drools-spring"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://drools.org/schema/drools-spring http://drools.org/schema/drools-spring.xsd">
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="persistenceUnitName" value="org.drools.persistence.jpa.local"/>
</bean>
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<drools-spring:grid-node id="node1"/>
<drools-spring:kbase id="kbase" node="node1">
<drools-spring:resources>
<drools-spring:resource type="BPMN2" source="classpath:test.bpmn"/>
</drools-spring:resources>
</drools-spring:kbase>
<drools-spring:ksession id="ksession" type="stateful" kbase="kbase" node="node1">
<drools-spring:configuration>
<drools-spring:jpa-persistence>
<drools-spring:transaction-manager ref="txManager"/>
<drools-spring:entity-manager-factory ref="entityManagerFactory"/>
</drools-spring:jpa-persistence>
<drools-spring:work-item-handlers>
<drools-spring:work-item-handler name="JavaServiceNode" ref="asyncWorkItemHandler"/>
</drools-spring:work-item-handlers>
</drools-spring:configuration>
</drools-spring:ksession>
<bean id="asyncWorkItemHandler" class="com.sample.test.AsyncWorkItemHandler"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@[...DBURL...]"/>
<property name="username" value="[username]"/>
<property name="password" value="[password]"/>
</bean>
</beans>
h2.
h2. Persistence.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persistence version="1.0"
xsi:schemaLocation=" http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd
http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
xmlns:orm=" http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance http://www.w3.org/2001/XMLSchema-instance"
xmlns=" http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence">
<persistence-unit name="org.drools.persistence.jpa.local" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/my-ds</jta-data-source>
<mapping-file>META-INF/JBPMorm.xml</mapping-file>
<mapping-file>META-INF/ProcessInstanceInfo.hbm.xml</mapping-file>
<class>org.drools.persistence.info.SessionInfo</class>
<class>org.jbpm.persistence.processinstance.ProcessInstanceInfo</class>
<class>org.drools.persistence.info.WorkItemInfo</class>
<class>org.jbpm.process.audit.ProcessInstanceLog</class>
<class>org.jbpm.process.audit.NodeInstanceLog</class>
<class>org.jbpm.process.audit.VariableInstanceLog</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
<property name="hibernate.max_fetch_depth" value="3"/>
<property name="hibernate.hbm2ddl.auto" value="validate" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.connection.datasource" value="java:comp/env/my-ds"/>
</properties>
</persistence-unit>
</persistence>
h2. test.bpmn:
<?xml version="1.0" encoding="UTF-8"?>
<definitions id="Definition"
targetNamespace="http://www.jboss.org/drools"
typeLanguage="http://www.java.com/javaTypes"
expressionLanguage="http://www.mvel.org/2.0"
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd"
xmlns:g="http://www.jboss.org/drools/flow/gpd"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
xmlns:tns="http://www.jboss.org/drools">
<process processType="Private" isExecutable="true" id="com.sample.bpmn" name="Sample Process" tns:packageName="defaultPackage" >
<!-- nodes -->
<startEvent id="_1" name="StartProcess" />
<endEvent id="_2" name="End" >
<terminateEventDefinition/>
</endEvent>
<task id="_3" name="Java Service Node" tns:taskName="JavaServiceNode" >
<ioSpecification>
<inputSet>
</inputSet>
<outputSet>
</outputSet>
</ioSpecification>
</task>
<!-- connections -->
<sequenceFlow id="_3-_2" sourceRef="_3" targetRef="_2" />
<sequenceFlow id="_1-_3" sourceRef="_1" targetRef="_3" />
</process>
</definitions>
h2. AsyncWorkItemHandler.java:
package com.sample.test;
import java.util.HashMap;
import java.util.Map;
import org.drools.runtime.process.WorkItem;
import org.drools.runtime.process.WorkItemHandler;
import org.drools.runtime.process.WorkItemManager;
public class AsyncWorkItemHandler implements WorkItemHandler
{
public void executeWorkItem(final WorkItem workItem, final WorkItemManager manager)
{
new Thread(new Runnable() {
public void run()
{
Object result = "result from an invoked service here...";
Map<String, Object> results = new HashMap<String, Object>();
results.put("result", result);
manager.completeWorkItem(workItem.getId(), results); *//HERE THE EXCEPTION IS THROWN*
return;
}
}).start();
}
public void abortWorkItem(WorkItem workItem, WorkItemManager manager)
{
}
}
h2. TestAsyncHandler.java:
package com.sample.test;
import org.drools.runtime.StatefulKnowledgeSession;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestAsyncHandler
{
public static void main(String[] args)
{
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("session.xml");
StatefulKnowledgeSession ksession = (StatefulKnowledgeSession) context.getBean("ksession");
ksession.startProcess("com.sample.bpmn");
System.out.println("done");
}
}
The mentioned exception is thrown on the manager.completeWorkItem .. line because the entity manager is closed by the time the ksession.startProcess("com.sample.bpmn") line returns. Somehow they are sharing the same entity manager.
I'm obviously missing something here, but I'm at loss as to what it is. I followed the jbpm guide for the spring integration.
Any help is much appreciated.
Thanks.
--------------------------------------------------------------
Reply to this message by going to Community
[https://community.jboss.org/message/749455#749455]
Start a new discussion in jBPM at Community
[https://community.jboss.org/choose-container!input.jspa?contentType=1&con...]
12 years, 5 months
[jBPM] - How to add Human task Groups and Users in a spring configuration.
by Miloud Haimoune
Miloud Haimoune [https://community.jboss.org/people/milhaim] created the discussion
"How to add Human task Groups and Users in a spring configuration."
To view the discussion, visit: https://community.jboss.org/message/748997#748997
--------------------------------------------------------------
Hi all,
I m using jbpm 5.3 in a spring application, a part of the config :
........
<bean id="taskService" class="org.jbpm.task.service.TaskService">
<constructor-arg index="0" ref="htEMF"/>
<constructor-arg index="1">
<bean factory-method="getSystemEventListener" class="org.drools.SystemEventListenerFactory"/>
</constructor-arg>
</bean>
<bean id="localTaskService" class="org.jbpm.task.service.local.LocalTaskService">
<constructor-arg index="0" ref="taskService"/>
</bean>
<bean id="humanTaskHandler" class="org.jbpm.process.workitem.wsht.SyncWSHumanTaskHandler">
<property name="client" ref="localTaskService"/>
</bean>
..
<drools:ksession id="ksession2" type="stateful" kbase="kbase2" node="node1">
<drools:configuration>
<drools:work-item-handlers>
<drools:work-item-handler name="Human Task" ref="humanTaskHandler"/>
</drools:work-item-handlers>
<drools:jpa-persistence>
<drools:transaction-manager ref="jbpmTxManager"/>
<drools:entity-manager-factory ref="jbpmEMF"/>
</drools:jpa-persistence>
</drools:configuration>
</drools:ksession>
do any one know how to add the Users and Groups (taskSession.addUser( new User("Administrator") );) etc ....
thnaks,
--------------------------------------------------------------
Reply to this message by going to Community
[https://community.jboss.org/message/748997#748997]
Start a new discussion in jBPM at Community
[https://community.jboss.org/choose-container!input.jspa?contentType=1&con...]
12 years, 5 months