[jboss-user] [jBPM] - Separating JBPM 5.1 Process persistence from workitemhandler business logic transaction

lakshmi sampath do-not-reply at jboss.com
Sun Mar 18 13:55:37 EDT 2012


lakshmi sampath [https://community.jboss.org/people/lakshmi.sampath] created the discussion

"Separating JBPM 5.1 Process persistence from workitemhandler business logic transaction"

To view the discussion, visit: https://community.jboss.org/message/724547#724547

--------------------------------------------------------------
Hi,

I am persisting the knowledge session using JPA/JTA and I need to separate jbpm process related persistence from business logic persistence so that when I use asynchronous service work item handlers to call the business logic
 and if the business logic fails and rollbacks a transaction, I still want the process related information, history log and mainly the asynchronous work item to be persisted.

Here's the exception thrown when JBPM tries to commit the asynchnous work item after the business logic called inside a workitem rollbacks a transaction.
1. How do I make sure that JBPM uses a separate transaction always and not share it with the business logic transaction.
2. Even if JBPM uses separate transaction, does it also rollback if business logic transaction rollbacks since they are part of same JTA User Transaction(Which I dont want JBPM to do).

Note: Both JBPM persistence and business logic share the same database and datasource.


2012-03-17 17:30:31,032 WARN [org.drools.persistence.jta.JtaTransactionManager] Unable to commit transaction
javax.transaction.RollbackException: [com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted] [com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted] Can't commit because the transaction is in aborted state
 at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1394)
 at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:135)
 at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:87)
 at org.jboss.tm.usertx.client.ServerVMClientUserTransaction.commit(ServerVMClientUserTransaction.java:140)
 at org.drools.persistence.jta.JtaTransactionManager.commit(JtaTransactionManager.java:167)
 at org.drools.persistence.SingleSessionCommandService.execute(SingleSessionCommandService.java:294)
 at org.drools.command.impl.CommandBasedStatefulKnowledgeSession.startProcessInstance(CommandBasedStatefulKnowledgeSession.java:237)
 at com.hp.adam.processengine.impl.JBPMProcessEngine.startProcess(JBPMProcessEngine.java:35)
...
Caused by: java.lang.IllegalStateException: BaseTransaction.rollback - [com.arjuna.ats.internal.jta.transaction.arjunacore.notx] [com.arjuna.ats.internal.jta.transaction.arjunacore.notx] no transaction!
 at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.rollback(BaseTransaction.java:158)
 at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.rollback(BaseTransactionManagerDelegate.java:126)
 at org.jboss.tm.usertx.client.ServerVMClientUserTransaction.rollback(ServerVMClientUserTransaction.java:148)
 at org.drools.persistence.jta.JtaTransactionManager.rollback(JtaTransactionManager.java:183)
 ... 21 more


Here's how I am configuring and starting the process. Note that I autowire spring to retrieve transaction manager, 
primarily to get hold of UserTransaction object instead of lookup from JNDI. 
---------------------------------------------------------------------------------------------------------------------------------------------------------

*@Autowired*
*org.springframework.transaction.jta.JtaTransactionManager txm;*

...

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbase=kbuilder.newKnowledgeBase();
kbuilder.add(ResourceFactory.newClassPathResource("bpmn2Process.bpmn"), ResourceType.BPMN2);

EntityManagerFactory emf =  Persistence.createEntityManagerFactory("org.jbpm.persistence.jpa");
Environment env = KnowledgeBaseFactory.newEnvironment();
env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, emf );
env.set(EnvironmentName.TRANSACTION, *txm.getUserTransaction()*);

StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession(kbase,null,env);
ksession.getWorkItemManager().registerWorkItemHandler("ServiceWorkItem", (WorkItemHandler)object); 
JPAWorkingMemoryDbLogger processDbLogger = new JPAWorkingMemoryDbLogger(ksession);
-----------------------------------------------------------------------------------------------------------------------------------------------------------

Also attached the persistence.xml file

thanks
lakshmi.
--------------------------------------------------------------

Reply to this message by going to Community
[https://community.jboss.org/message/724547#724547]

Start a new discussion in jBPM at Community
[https://community.jboss.org/choose-container!input.jspa?contentType=1&containerType=14&container=2034]

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/jboss-user/attachments/20120318/db3d187b/attachment.html 


More information about the jboss-user mailing list