Sounds like you are accessing to the same session from different threads and just one of them can complete the transaction. That&#39;s the expected behavior.<div>Greetings.<br><br><div class="gmail_quote">On Wed, Nov 24, 2010 at 10:40 AM,  <span dir="ltr">&lt;<a href="mailto:darren.kay@bt.com">darren.kay@bt.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div class="im">Drools Version: 5.1.0<br>
JBoss Version: 5.1.0 GA (Clustered)<br>
<br>
</div>We&#39;re using a clustered JBoss setup (with 2 nodes) with Drools and getting an intermittent stale ksession exception - stack trace attached below.<br>
<div><div></div><div class="h5"><br>
We use &#39;org.drools.persistence.jpa.JPAKnowledgeService&#39; to persist KnowledgeSession to a MySQL database and use Hibernate to manage the transactions.<br>
<br>
In case of a new request, we create a new Drools Knowledge Session and persist it and store the knowledge session id to our database.<br>
<br>
StatefulKnowledgeSession session = JPAKnowledgeService.newStatefulKnowledgeSession(knowledgeBase, null, environment);<br>
return session;<br>
<br>
For all subsequent requests we load the Knowledge session from the database using the knowledge session id.<br>
<br>
StatefulKnowledgeSession session = JPAKnowledgeService.loadStatefulKnowledgeSession(sessionId, knowledgeBase, null,     environment);<br>
return session;<br>
<br>
We receive request from the front-end validate the information and update the knowledge session facts using;<br>
<br>
public void insertOrUpdateSessionFacts(StatefulKnowledgeSession session, Object...objects) {<br>
<br>
       boolean factMatched = false;<br>
<br>
       for (Object obj: objects) {<br>
<br>
               //get all session facts<br>
               Collection&lt;Object&gt; facts = session.getObjects();<br>
<br>
               for (Object fact: facts) {<br>
                       if (fact.getClass().toString().equals(obj.getClass().toString())) {<br>
                               //update fact in session<br>
                               session.update(session.getFactHandle(fact), obj);<br>
                               factMatched = true;<br>
                               break;<br>
                       }<br>
               }<br>
<br>
               if (factMatched) {<br>
                       factMatched = false;<br>
               } else {<br>
                       //fact not found, so insert new fact<br>
                       session.insert(obj);<br>
               }<br>
       }<br>
}<br>
<br>
After the facts are updated we use find the response variable populated from the Drools flow and pass it back to the front-end;<br>
<br>
//get variable scope context<br>
VariableScopeInstance vi = (VariableScopeInstance) processInstance.getContextInstance(VariableScope.VARIABLE_SCOPE);<br>
return vi.getVariable(variableName);<br>
<br>
Any pointers would be much appreciated Stack Trace is below<br>
<br>
Darren<br>
<br>
-------------------------------------<br>
<br>
2010-11-23 04:40:26,838 INFO  [STDOUT] (pool-47-thread-1) Hibernate: select workitemin0_.workItemId as workItemId92_0_, workitemin0_.creationDate as creation2_92_0_, workitemin0_.externalVariables as external3_92_0_, workitemin0_.name as name92_0_, workitemin0_.processInstanceId as processI5_92_0_, workitemin0_.state as state92_0_, workitemin0_.OPTLOCK as OPTLOCK92_0_, workitemin0_.workItemByteArray as workItem8_92_0_ from WorkItemInfo workitemin0_ where workitemin0_.workItemId=?<br>

2010-11-23 04:40:26,841 INFO  [STDOUT] (pool-47-thread-1) Hibernate: select variables0_.workItemId as workItemId1_, variables0_.id as id1_, variables0_.name as formula1_1_, variables0_.id as id94_0_, variables0_.name as name94_0_, variables0_.persister as persister94_0_, variables0_.processInstanceId as processI5_94_0_, variables0_.workItemId as workItemId94_0_ from VariableInstanceInfo variables0_ where variables0_.workItemId=?<br>

2010-11-23 04:40:26,857 INFO  [STDOUT] (pool-47-thread-1) Hibernate: update ProcessInstanceInfo set externalVariables=?, lastModificationDate=?, lastReadDate=?, processId=?, processInstanceByteArray=?, startDate=?, state=?, OPTLOCK=? where InstanceId=? and OPTLOCK=?<br>

2010-11-23 04:40:26,864 ERROR [org.hibernate.event.def.AbstractFlushingEventListener] (pool-47-thread-1) Could not synchronize database state with session<br>
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [org.drools.persistence.processinstance.ProcessInstanceInfo#14]<br>
       at org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:1792)<br>
       at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2435)<br>
       at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2335)<br>
       at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2635)<br>
       at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:115)<br>
       at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)<br>
       at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)<br>
       at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168)<br>
       at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)<br>
       at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)<br>
       at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)<br>
       at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365)<br>
       at org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:504)<br>
       at com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:101)<br>
       at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:269)<br>
       at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:89)<br>
       at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:177)<br>
       at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1423)<br>
       at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:137)<br>
       at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:75)<br>
       at org.jboss.aspects.tx.TxPolicy.endTransaction(TxPolicy.java:170)<br>
       at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:87)<br>
       at org.jboss.aspects.tx.TxInterceptor$RequiresNew.invoke(TxInterceptor.java:261)<br>
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)<br>
       at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)<br>
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)<br>
       at org.jboss.ejb3.tx.NullInterceptor.invoke(NullInterceptor.java:42)<br>
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)<br>
       at org.jboss.ejb3.security.Ejb3AuthenticationInterceptorv2.invoke(Ejb3AuthenticationInterceptorv2.java:186)<br>
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)<br>
       at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:41)<br>
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)<br>
       at org.jboss.ejb3.BlockContainerShutdownInterceptor.invoke(BlockContainerShutdownInterceptor.java:67)<br>
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)<br>
       at org.jboss.aspects.currentinvocation.CurrentInvocationInterceptor.invoke(CurrentInvocationInterceptor.java:67)<br>
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)<br>
       at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:421)<br>
       at org.jboss.ejb3.remoting.IsLocalInterceptor.invokeLocal(IsLocalInterceptor.java:85)<br>
       at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:72)<br>
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)<br>
       at org.jboss.aspects.remoting.PojiProxy.invoke(PojiProxy.java:62)<br>
       at $Proxy608.invoke(Unknown Source)<br>
       at org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:207)<br>
       at org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:164)<br>
       at $Proxy607.processKbdRequest(Unknown Source)<br>
       at net.plus.kbd.faults.gateway.actions.DroolsFlowSender.process(DroolsFlowSender.java:84)<br>
       at sun.reflect.GeneratedMethodAccessor807.invoke(Unknown Source)<br>
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)<br>
       at java.lang.reflect.Method.invoke(Unknown Source)<br>
       at org.jboss.soa.esb.listeners.message.ActionProcessorMethodInfo.processMethods(ActionProcessorMethodInfo.java:102)<br>
       at org.jboss.soa.esb.listeners.message.OverriddenActionLifecycleProcessor.process(OverriddenActionLifecycleProcessor.java:74)<br>
       at org.jboss.soa.esb.listeners.message.ActionProcessingPipeline.processPipeline(ActionProcessingPipeline.java:649)<br>
       at org.jboss.soa.esb.listeners.message.ActionProcessingPipeline.processPipeline(ActionProcessingPipeline.java:603)<br>
       at org.jboss.soa.esb.listeners.message.ActionProcessingPipeline.process(ActionProcessingPipeline.java:433)<br>
       at org.jboss.soa.esb.listeners.message.MessageAwareListener$TransactionalRunner.run(MessageAwareListener.java:540)<br>
       at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)<br>
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)<br>
       at java.lang.Thread.run(Unknown Source)<br>
2010-11-23 04:40:26,871 WARN  [com.arjuna.ats.arjuna.logging.arjLoggerI18N] (pool-47-thread-1) [com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator_2] TwoPhaseCoordinator.beforeCompletion - failed for com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple@c9c803<br>

javax.persistence.OptimisticLockException: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [org.drools.persistence.processinstance.ProcessInstanceInfo#14]<br>

       at org.hibernate.ejb.AbstractEntityManagerImpl.wrapStaleStateException(AbstractEntityManagerImpl.java:630)<br>
       at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:588)<br>
       at org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:513)<br>
       at com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:101)<br>
       at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:269)<br>
       at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:89)<br>
       at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:177)<br>
       at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1423)<br>
       at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:137)<br>
       at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:75)<br>
       at org.jboss.aspects.tx.TxPolicy.endTransaction(TxPolicy.java:170)<br>
       at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:87)<br>
at org.jboss.aspects.tx.TxInterceptor$RequiresNew.invoke(TxInterceptor.java:261)<br>
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)<br>
       at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)<br>
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)<br>
       at org.jboss.ejb3.tx.NullInterceptor.invoke(NullInterceptor.java:42)<br>
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)<br>
       at org.jboss.ejb3.security.Ejb3AuthenticationInterceptorv2.invoke(Ejb3AuthenticationInterceptorv2.java:186)<br>
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)<br>
       at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:41)<br>
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)<br>
       at org.jboss.ejb3.BlockContainerShutdownInterceptor.invoke(BlockContainerShutdownInterceptor.java:67)<br>
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)<br>
       at org.jboss.aspects.currentinvocation.CurrentInvocationInterceptor.invoke(CurrentInvocationInterceptor.java:67)<br>
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)<br>
       at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:421)<br>
       at org.jboss.ejb3.remoting.IsLocalInterceptor.invokeLocal(IsLocalInterceptor.java:85)<br>
       at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:72)<br>
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)<br>
       at org.jboss.aspects.remoting.PojiProxy.invoke(PojiProxy.java:62)<br>
       at $Proxy608.invoke(Unknown Source)<br>
       at org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:207)<br>
       at org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:164)<br>
       at $Proxy607.processKbdRequest(Unknown Source)<br>
       at net.plus.kbd.faults.gateway.actions.DroolsFlowSender.process(DroolsFlowSender.java:84)<br>
       at sun.reflect.GeneratedMethodAccessor807.invoke(Unknown Source)<br>
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)<br>
       at java.lang.reflect.Method.invoke(Unknown Source)<br>
       at org.jboss.soa.esb.listeners.message.ActionProcessorMethodInfo.processMethods(ActionProcessorMethodInfo.java:102)<br>
       at org.jboss.soa.esb.listeners.message.OverriddenActionLifecycleProcessor.process(OverriddenActionLifecycleProcessor.java:74)<br>
       at org.jboss.soa.esb.listeners.message.ActionProcessingPipeline.processPipeline(ActionProcessingPipeline.java:649)<br>
       at org.jboss.soa.esb.listeners.message.ActionProcessingPipeline.processPipeline(ActionProcessingPipeline.java:603)<br>
       at org.jboss.soa.esb.listeners.message.ActionProcessingPipeline.process(ActionProcessingPipeline.java:433)<br>
       at org.jboss.soa.esb.listeners.message.MessageAwareListener$TransactionalRunner.run(MessageAwareListener.java:540)<br>
       at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)<br>
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)<br>
       at java.lang.Thread.run(Unknown Source)<br>
Caused by: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [org.drools.persistence.processinstance.ProcessInstanceInfo#14]<br>
       at org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:1792)<br>
       at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2435)<br>
       at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2335)<br>
       at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2635)<br>
at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:115)<br>
       at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)<br>
       at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)<br>
       at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168)<br>
       at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)<br>
       at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)<br>
       at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)<br>
       at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365)<br>
       at org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:504)<br>
       ... 45 more<br>
<br>
<br>
<br>
_______________________________________________<br>
rules-dev mailing list<br>
<a href="mailto:rules-dev@lists.jboss.org">rules-dev@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/rules-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-dev</a><br>
<br>
<br>
</div></div>_______________________________________________<br>
rules-users mailing list<br>
<div class="im"><a href="mailto:rules-users@lists.jboss.org">rules-users@lists.jboss.org</a><br>
</div><a href="https://lists.jboss.org/mailman/listinfo/rules-users" target="_blank">https://lists.jboss.org/mailman/listinfo/rules-users</a><br>
</blockquote></div><br><br clear="all"><br>-- <br> - CTO @ <a href="http://www.plugtree.com">http://www.plugtree.com</a>  <br> - MyJourney @ <a href="http://salaboy.wordpress.com">http://salaboy.wordpress.com</a><br> - Co-Founder @ <a href="http://www.jbug.com.ar">http://www.jbug.com.ar</a><br>
 <br> - Salatino &quot;Salaboy&quot; Mauricio -<br>
</div>