How to join a JBPM5 transaction in a standalone web design?
mvermand Sep 18, 2013 3:53 AMHi,
I'm using the JBPM 5.2 jars inside a webapp that runs on a JBoss AS 7.
jbpmEmf = Persistence.createEntityManagerFactory("org.jbpm.persistence.jpa"));
JBPM works fine.
Now I want to create custom JPA entities and manipulate these together with the JBPM entities.
Example: when a requests comes to start an instance of a Process, I want to store the external Id that is provided in the request because in that way I can reload the specific kbase and ksession when later on a sequential request is made with the same external Id as argument.
My problem is that I do not know how to join the transaction that will be used by JBPM to create the process instance entity and workitem entities...
I extended the persistence.xml:
<persistence-unit name="org.jbpm.persistence.jpa" transaction-type="JTA"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>jdbc/WmsFlow</jta-data-source> <mapping-file>META-INF/JBPMorm.xml</mapping-file> <mapping-file>META-INF/Taskorm.xml</mapping-file> <mapping-file>META-INF/ProcessInstanceInfo.hbm.xml</mapping-file> <class>org.jbpm.persistence.processinstance.ProcessInstanceInfo</class> <class>org.drools.persistence.info.SessionInfo</class> ... <class>org.jbpm.task.OnParentAbortAllSubTasksEndStrategy</class> <class>org.jbpm.task.OnAllSubTasksEndParentEndStrategy</class> <class>org.jbpm.task.User</class> <!-- START OF WMS ENTITIES --> <class>be.wms.DeploymentProperty</class> <class>be.wms.Deployment</class> <class>be.wms.Scenario</class> <class>be.wms.ScenarioInstanceLog</class> <class>be.wms.Artifact</class> <class>be.wms.ItemEvent</class> <class>be.wms.SessionLookup</class> <!-- END OF WMS ENTITIES --> <properties> <property name="hibernate.max_fetch_depth" value="3" /> <property name="hibernate.hbm2ddl.auto" value="none" /> <property name="hibernate.show_sql" value="false" /> <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" /> <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" /> </properties> </persistence-unit>
I have created a EntityManagerFactory:
jbpmEmf = Persistence.createEntityManagerFactory("org.jbpm.persistence.jpa");
Now, before I start a new process instance, I want to store the external Id in the same JTA transaction as will be used by JBPM.
I have a REST resource in my app that is called to start a process instance:
(simplified code:)
@PUT
@Path("/{name}/{version}")
@Produces(MediaType.APPLICATION_JSON)
public ScenarioInstance startProcessInstance(@PathParam("name") String name, @PathParam("version") String version,
Map<String, Object> params) {
String externalId = params.get("externalid").toString();
KnowledgeBase kbase = buildKnowledgeBase(name, version); // support for different versions.
// jbpmEmf is a EntityMananagerFactory created from "org.jbpm.persistence.jpa"
StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession(kbase, null, createEnvironment(jbpmEmf));
int ksessionId = ksession.getId();
WMSSession wsession = new WMSSession(externalId, ksessionId);
//=> how to get the EntityManager used by JBPM to persist wsession?
EntityManager em = ??? <===
em.persist(wsession);
ProcessInstance processInstance = ksession.startProcess(processId, params);
...
}
/**
* Create a new environment
* @param emf the EntityManagerFactory
* @return new Environment
* @throws NamingException
*/
protected static Environment createEnvironment(EntityManagerFactory emf) throws NamingException {
Environment env = KnowledgeBaseFactory.newEnvironment();
env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf);
env.set(EnvironmentName.TRANSACTION_MANAGER, getTransactionManager());
return env;
}
So my question is: (line 17): how to get the EntityManager uwed by JBPM to persist the wsession object?
Thanks,
Michiel