[rules-dev] Cannot synchronize database state with session

Esteban Aliverti esteban.aliverti at gmail.com
Wed Nov 24 06:55:12 EST 2010


Just wondering, does your process has timers?

By the way you should post this kind of emails in
rules-users at lists.jboss.org

Best Regards,

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Esteban Aliverti
- Developer @ http://www.plugtree.com
- Blog @ http://ilesteban.wordpress.com


On Tue, Nov 23, 2010 at 2:13 PM, <darren.kay at bt.com> wrote:

> Drools Version: 5.1.0
> JBoss Version: 5.1.0 GA (Clustered)
>
> We're using a clustered JBoss setup (with 2 nodes) with Drools and getting
> an intermitten stale ksession exception - stack trace attached below.
>
> We use 'org.drools.persistence.jpa.JPAKnowledgeService' to persist
> KnowledgeSession to a MySQL database and use Hibernate to manage the
> transactions.
>
> 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.
>
> StatefulKnowledgeSession session =
> JPAKnowledgeService.newStatefulKnowledgeSession(knowledgeBase, null,
> environment);
> return session;
>
> For all subsequent requests we load the Knowledge session from the database
> using the knowledge session id.
>
> StatefulKnowledgeSession session =
> JPAKnowledgeService.loadStatefulKnowledgeSession(sessionId, knowledgeBase,
> null,     environment);
> return session;
>
> We receive request from the front-end validate the information and update
> the knowledge session facts using;
>
> public void insertOrUpdateSessionFacts(StatefulKnowledgeSession session,
> Object...objects) {
>
>        boolean factMatched = false;
>
>        for (Object obj: objects) {
>
>                //get all session facts
>                Collection<Object> facts = session.getObjects();
>
>                for (Object fact: facts) {
>                        if
> (fact.getClass().toString().equals(obj.getClass().toString())) {
>                                //update fact in session
>                                session.update(session.getFactHandle(fact),
> obj);
>                                factMatched = true;
>                                break;
>                        }
>                }
>
>                if (factMatched) {
>                        factMatched = false;
>                } else {
>                        //fact not found, so insert new fact
>                        session.insert(obj);
>                }
>        }
> }
>
> After the facts are updated we use find the response variable populated
> from the Drools flow and pass it back to the front-end;
>
> //get variable scope context
> VariableScopeInstance vi = (VariableScopeInstance)
> processInstance.getContextInstance(VariableScope.VARIABLE_SCOPE);
> return vi.getVariable(variableName);
>
> Any pointers would be much appreciated. Stack Trace is below
>
> Darren
>
> 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=?
> 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=?
> 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=?
> 2010-11-23 04:40:26,864 ERROR
> [org.hibernate.event.def.AbstractFlushingEventListener] (pool-47-thread-1)
> Could not synchronize database state with session
> org.hibernate.StaleObjectStateException: Row was updated or deleted by
> another transaction (or unsaved-value mapping was incorrect):
> [org.drools.persistence.processinstance.ProcessInstanceInfo#14]
>        at
> org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:1792)
>        at
> org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2435)
>        at
> org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2335)
>        at
> org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2635)
>        at
> org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:115)
>        at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
>        at
> org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
>        at
> org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168)
>        at
> org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
>        at
> org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
>        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
>        at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365)
>        at
> org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:504)
>        at
> com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:101)
>        at
> com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:269)
>        at
> com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:89)
>        at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:177)
>        at
> com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1423)
>        at
> com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:137)
>        at
> com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:75)
>        at org.jboss.aspects.tx.TxPolicy.endTransaction(TxPolicy.java:170)
>        at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:87)
>        at
> org.jboss.aspects.tx.TxInterceptor$RequiresNew.invoke(TxInterceptor.java:261)
>        at
> org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
>        at
> org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
>        at
> org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
>        at org.jboss.ejb3.tx.NullInterceptor.invoke(NullInterceptor.java:42)
>        at
> org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
>        at
> org.jboss.ejb3.security.Ejb3AuthenticationInterceptorv2.invoke(Ejb3AuthenticationInterceptorv2.java:186)
>        at
> org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
>        at
> org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:41)
>        at
> org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
>        at
> org.jboss.ejb3.BlockContainerShutdownInterceptor.invoke(BlockContainerShutdownInterceptor.java:67)
>        at
> org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
>        at
> org.jboss.aspects.currentinvocation.CurrentInvocationInterceptor.invoke(CurrentInvocationInterceptor.java:67)
>        at
> org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
>        at
> org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:421)
>        at
> org.jboss.ejb3.remoting.IsLocalInterceptor.invokeLocal(IsLocalInterceptor.java:85)
>        at
> org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:72)
>        at
> org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
>        at org.jboss.aspects.remoting.PojiProxy.invoke(PojiProxy.java:62)
>        at $Proxy608.invoke(Unknown Source)
>        at
> org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:207)
>        at
> org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:164)
>        at $Proxy607.processKbdRequest(Unknown Source)
>        at
> net.plus.kbd.faults.gateway.actions.DroolsFlowSender.process(DroolsFlowSender.java:84)
>        at sun.reflect.GeneratedMethodAccessor807.invoke(Unknown Source)
>        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
>        at java.lang.reflect.Method.invoke(Unknown Source)
>        at
> org.jboss.soa.esb.listeners.message.ActionProcessorMethodInfo.processMethods(ActionProcessorMethodInfo.java:102)
>        at
> org.jboss.soa.esb.listeners.message.OverriddenActionLifecycleProcessor.process(OverriddenActionLifecycleProcessor.java:74)
>        at
> org.jboss.soa.esb.listeners.message.ActionProcessingPipeline.processPipeline(ActionProcessingPipeline.java:649)
>        at
> org.jboss.soa.esb.listeners.message.ActionProcessingPipeline.processPipeline(ActionProcessingPipeline.java:603)
>        at
> org.jboss.soa.esb.listeners.message.ActionProcessingPipeline.process(ActionProcessingPipeline.java:433)
>        at
> org.jboss.soa.esb.listeners.message.MessageAwareListener$TransactionalRunner.run(MessageAwareListener.java:540)
>        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown
> Source)
>        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown
> Source)
>        at java.lang.Thread.run(Unknown Source)
> 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 at c9c803
> 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]
>        at
> org.hibernate.ejb.AbstractEntityManagerImpl.wrapStaleStateException(AbstractEntityManagerImpl.java:630)
>        at
> org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:588)
>        at
> org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:513)
>        at
> com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:101)
>        at
> com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:269)
>        at
> com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:89)
>        at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:177)
>        at
> com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1423)
>        at
> com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:137)
>        at
> com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:75)
>        at org.jboss.aspects.tx.TxPolicy.endTransaction(TxPolicy.java:170)
>        at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:87)
> at
> org.jboss.aspects.tx.TxInterceptor$RequiresNew.invoke(TxInterceptor.java:261)
>        at
> org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
>        at
> org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
>        at
> org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
>        at org.jboss.ejb3.tx.NullInterceptor.invoke(NullInterceptor.java:42)
>        at
> org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
>        at
> org.jboss.ejb3.security.Ejb3AuthenticationInterceptorv2.invoke(Ejb3AuthenticationInterceptorv2.java:186)
>        at
> org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
>        at
> org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:41)
>        at
> org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
>        at
> org.jboss.ejb3.BlockContainerShutdownInterceptor.invoke(BlockContainerShutdownInterceptor.java:67)
>        at
> org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
>        at
> org.jboss.aspects.currentinvocation.CurrentInvocationInterceptor.invoke(CurrentInvocationInterceptor.java:67)
>        at
> org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
>        at
> org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:421)
>        at
> org.jboss.ejb3.remoting.IsLocalInterceptor.invokeLocal(IsLocalInterceptor.java:85)
>        at
> org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:72)
>        at
> org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
>        at org.jboss.aspects.remoting.PojiProxy.invoke(PojiProxy.java:62)
>        at $Proxy608.invoke(Unknown Source)
>        at
> org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:207)
>        at
> org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:164)
>        at $Proxy607.processKbdRequest(Unknown Source)
>        at
> net.plus.kbd.faults.gateway.actions.DroolsFlowSender.process(DroolsFlowSender.java:84)
>        at sun.reflect.GeneratedMethodAccessor807.invoke(Unknown Source)
>        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
>        at java.lang.reflect.Method.invoke(Unknown Source)
>        at
> org.jboss.soa.esb.listeners.message.ActionProcessorMethodInfo.processMethods(ActionProcessorMethodInfo.java:102)
>        at
> org.jboss.soa.esb.listeners.message.OverriddenActionLifecycleProcessor.process(OverriddenActionLifecycleProcessor.java:74)
>        at
> org.jboss.soa.esb.listeners.message.ActionProcessingPipeline.processPipeline(ActionProcessingPipeline.java:649)
>        at
> org.jboss.soa.esb.listeners.message.ActionProcessingPipeline.processPipeline(ActionProcessingPipeline.java:603)
>        at
> org.jboss.soa.esb.listeners.message.ActionProcessingPipeline.process(ActionProcessingPipeline.java:433)
>        at
> org.jboss.soa.esb.listeners.message.MessageAwareListener$TransactionalRunner.run(MessageAwareListener.java:540)
>        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown
> Source)
>        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown
> Source)
>        at java.lang.Thread.run(Unknown Source)
> 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]
>        at
> org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:1792)
>        at
> org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2435)
>        at
> org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2335)
>        at
> org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2635)
> at
> org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:115)
>        at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
>        at
> org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
>        at
> org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168)
>        at
> org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
>        at
> org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
>        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
>        at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365)
>        at
> org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:504)
>        ... 45 more
>
>
>
> _______________________________________________
> rules-dev mailing list
> rules-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-dev/attachments/20101124/1b1a3205/attachment-0001.html 


More information about the rules-dev mailing list