[rules-users] Drools Human Task Service Persistence

loumimi moundir.jamal-ext at sgcib.com
Fri May 13 12:56:19 EDT 2011


Hello,

I switch from drools 5.0.1 to drools 5.1.0, the problem is resolved, I m
using the bitronix transaction manager, I kept transaction-type to
"RESOURCE_LOCAL". So every things seem to be good, I have no exception.
But no data is persisted in my database. So I tried to change the
transaction type to JTA but I m getting the exception bellow :
SEVERE: an assertion failure occured (this may indicate a bug in Hibernate,
but is more likely due to unsafe use of the session)
org.hibernate.AssertionFailure: Transaction MARKED_FOR_JOINED after isOpen()
call
      at
org.hibernate.ejb.AbstractEntityManagerImpl.joinTransaction(AbstractEntityManagerImpl.java:465)
      at
org.hibernate.ejb.AbstractEntityManagerImpl.postInit(AbstractEntityManagerImpl.java:82)
      at
org.hibernate.ejb.EntityManagerImpl.<init>(EntityManagerImpl.java:61)
      at
org.hibernate.ejb.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:39)
      at
org.hibernate.ejb.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:34)
      at
org.drools.persistence.session.DefaultJpaManager.getApplicationScopedEntityManager(DefaultJpaManager.java:37)
      at
org.drools.persistence.session.SingleSessionCommandService.<init>(SingleSessionCommandService.java:124)
      at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
Method)
      at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown
Source)
      at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown
Source)
      at java.lang.reflect.Constructor.newInstance(Unknown Source)
      at
org.drools.persistence.jpa.impl.KnowledgeStoreServiceImpl.buildCommanService(KnowledgeStoreServiceImpl.java:119)
      at
org.drools.persistence.jpa.impl.KnowledgeStoreServiceImpl.newStatefulKnowledgeSession(KnowledgeStoreServiceImpl.java:57)
      at
org.drools.persistence.jpa.JPAKnowledgeService.newStatefulKnowledgeSession(JPAKnowledgeService.java:109)
      at com.sample.ProcessTest.main(ProcessTest.java:69)
java.lang.IllegalStateException: java.lang.reflect.InvocationTargetException
      at
org.drools.persistence.jpa.impl.KnowledgeStoreServiceImpl.buildCommanService(KnowledgeStoreServiceImpl.java:133)
      at
org.drools.persistence.jpa.impl.KnowledgeStoreServiceImpl.newStatefulKnowledgeSession(KnowledgeStoreServiceImpl.java:57)
      at
org.drools.persistence.jpa.JPAKnowledgeService.newStatefulKnowledgeSession(JPAKnowledgeService.java:109)
      at com.sample.ProcessTest.main(ProcessTest.java:69)
Caused by: java.lang.reflect.InvocationTargetException
      at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
Method)
      at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown
Source)
      at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown
Source)
      at java.lang.reflect.Constructor.newInstance(Unknown Source)
      at
org.drools.persistence.jpa.impl.KnowledgeStoreServiceImpl.buildCommanService(KnowledgeStoreServiceImpl.java:119)
      ... 3 more
Caused by: java.lang.RuntimeException: Could not commit session
      at
org.drools.persistence.session.SingleSessionCommandService.<init>(SingleSessionCommandService.java:135)
      ... 8 more
Caused by: org.hibernate.AssertionFailure: Transaction MARKED_FOR_JOINED
after isOpen() call
      at
org.hibernate.ejb.AbstractEntityManagerImpl.joinTransaction(AbstractEntityManagerImpl.java:465)
      at
org.hibernate.ejb.AbstractEntityManagerImpl.postInit(AbstractEntityManagerImpl.java:82)
      at
org.hibernate.ejb.EntityManagerImpl.<init>(EntityManagerImpl.java:61)
      at
org.hibernate.ejb.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:39)
      at
org.hibernate.ejb.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:34)
      at
org.drools.persistence.session.DefaultJpaManager.getApplicationScopedEntityManager(DefaultJpaManager.java:37)
      at
org.drools.persistence.session.SingleSessionCommandService.<init>(SingleSessionCommandService.java:124)
      ... 8 more

I tried to add the objects you mentioned, I added only 3, I didn’t add  
env.set(EnvironmentName.TRANSACTION_SYNCHRONIZATION_REGISTRY,
this.txSvc.getTransactionSynchronizationRegistry());
because 
new InitialContext().lookup(
"java:comp/env/TransactionSynchronizationRegistry" ); 
Return null even I add 
javax.transaction.TransactionSynchronizationRegistry  =
bitronix.tm.BitronixTransactionSynchronizationRegistryObjectFactory
in my jndi.properties file

here is my code
    UserTransaction ut = (UserTransaction) new InitialContext().lookup(
"java:comp/UserTransaction" );
                // create the entity manager factory and register it in the
environment
                EntityManagerFactory emf = 
Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" );
                Environment env = KnowledgeBaseFactory.newEnvironment();
                env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, emf );
                env.set(EnvironmentName.TRANSACTION_MANAGER,
TransactionManagerServices.getTransactionManager()); 
                env.set(EnvironmentName.GLOBALS, new MapGlobalResolver()); 
                env.set(EnvironmentName.TRANSACTION, ut);
//TransactionSynchronizationRegistryHelper tsr =
(TransactionSynchronizationRegistryHelper) new InitialContext().lookup(
"java:comp/env/TransactionSynchronizationRegistry" );
                //
env.set(EnvironmentName.TRANSACTION_SYNCHRONIZATION_REGISTRY, tsr ); 

                // create a new knowledge session that uses JPA to store the
runtime state
                StatefulKnowledgeSession ksession =
JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );

                // start the transaction
                      ut.begin();
                // invoke methods on your method here
                ProcessInstance process = ksession.startProcess(
"com.sample.ruleflow" );
                ksession.signalEvent("Test", "Test", process.getId());
                ut.commit();
                ut.begin();
                ksession.fireAllRules();
                // commit the transaction
                ut.commit();
                ksession.dispose();

any idea ?

Thanks

Regards,

From: rules-users-bounces at lists.jboss.org
[mailto:rules-users-bounces at lists.jboss.org] On Behalf Of Rui Tang
Sent: Friday,May 13,2011 3:58 AM
To: Rules Users List
Subject: Re: [rules-users] Drools Human Task Service Persistence

Drools Persistence JPA module must use JTA instead of local transaction.

<persistence-unit name="org.drools.persistence.jpa"
transaction-type="RESOURCE_LOCAL">

should change to 

<persistence-unit name="default" transaction-type="JTA">

and

env.set( EnvironmentName.TRANSACTION_MANAGER, XXXXXXXXXXX );

your transaction manager should be get from JNDI like 

UserTransaction utx = (UserTransaction)
ctx.lookup("java:comp/UserTransaction");

Your JBoss transaction manager component should register the UserTransaction
into that JNDO name. (In some JTA implementations the UserTransaction and
TransactionManager have the same interfaces). And to make Drools Persistence
JPA works, you should put 4 or 5 objects into env, they are: 

env.set(EnvironmentName.ENTITY_MANAGER_FACTORY,
this.defaultPersistenceSvc.getSessionFactory());
env.set(EnvironmentName.APP_SCOPED_ENTITY_MANAGER,
this.defaultPersistenceSvc.getCurrentSession()); // If you don't handle the
EntityManager your self, you can omit this line.
env.set(EnvironmentName.TRANSACTION_MANAGER,
this.txSvc.getTransactionManager()); // java:comp/env/TransactionManager
env.set(EnvironmentName.TRANSACTION, this.txSvc.getTransaction()); //
java:comp/UserTransaction
env.set(EnvironmentName.TRANSACTION_SYNCHRONIZATION_REGISTRY,
this.txSvc.getTransactionSynchronizationRegistry()); //
java:comp/env/TransactionSynchronizationRegistry

all the methods called from txSvc fetch objects from according JNDI. In my
application all these JNDI objects are config-ed via Tomcat like this (in
META-INF/context.xml):

    <Resource name="jdbc/defaultDS" auth="Container"
type="javax.sql.XADataSource"
        factory="bitronix.tm.resource.ResourceObjectFactory"
        uniqueName="jdbc/defaultDS" />

    <Resource name="jdbc/droolsTaskDS" auth="Container"
type="javax.sql.XADataSource"
        factory="bitronix.tm.resource.ResourceObjectFactory"
        uniqueName="jdbc/droolsTaskDS" />
        
    <Resource name="TransactionManager" auth="Container"
        type="javax.transaction.TransactionManager"
        factory="bitronix.tm.BitronixTransactionManagerObjectFactory" />
        
    <Resource name="TransactionSynchronizationRegistry" auth="Container"
        type="javax.transaction.TransactionSynchronizationRegistry"
       
factory="bitronix.tm.BitronixTransactionSynchronizationRegistryObjectFactory"
/>

    <Resource name="UserTransaction" auth="Container"
        type="javax.transaction.UserTransaction" />
    <Transaction factory="bitronix.tm.BitronixUserTransactionObjectFactory"
/>


--
View this message in context: http://drools.46999.n3.nabble.com/Drools-Human-Task-Service-Persistence-tp1868778p2935598.html
Sent from the Drools: User forum mailing list archive at Nabble.com.




More information about the rules-users mailing list