0 Replies Latest reply on Feb 11, 2008 6:51 AM by Peter Brewer

    jbpm timer duedate causes StaleObjectStateException

    Peter Brewer Novice

      I have a state node that requires a specific time be set (e.g. at 16:00 instead of 3 hours from now). I can achieve this via the following:

      jpdl code:

       <state name="Buffer period">
       <event type="timer-create">
       <action expression="#{orderFulfillmentWorkflow.setBufferDueDate}" />
       </event>
       <timer duedate="12 hours">
       <action expression="#{orderFulfillmentWorkflow.progress}" />
       </timer>
       <transition name="bufferPeriodTimeout" to="Is order valid?"></transition>
       </state>
      


      java (seam) code:
       public void setBufferDueDate() {
       Timer timer = ExecutionContext.currentExecutionContext().getTimer() ;
       if (timer != null) {
       // 3 min in future for test purposes...
       Date bufferDueDate = new Date( now.getTime() + 180000 )
       getLog().debug("Buffer due to expire on #0", bufferDueDate) ;
      
       timer.setDueDate(bufferDueDate) ;
      
       } else {
       getLog().error("No timer was available.") ;
       }
      
       }
      
       public void progress() {
       ExecutionContext.currentExecutionContext().leaveNode() ;
       }
      


      The timer then fires at the time I set and the workflow then progresses until the end (or hits a wait state). At that point, the following exception is logged and the workflow is not saved:

      2008-02-11 11:05:02,412 DEBUG [org.jbpm.svc.save.CascadeSaveOperation] cascading save of 'org.jbpm.graph.exe.ProcessInstance@1090b29'
      2008-02-11 11:05:02,412 DEBUG [org.jbpm.svc.save.CascadeSaveOperation] cascading save to process instance 'org.jbpm.graph.exe.ProcessInstance@14a7b0c'
      2008-02-11 11:05:02,412 DEBUG [org.jbpm.svc.Services] executing default save operations
      2008-02-11 11:05:02,412 DEBUG [org.jbpm.svc.save.HibernateSaveOperation] saving process instance
      2008-02-11 11:05:02,412 DEBUG [org.jbpm.svc.save.SaveLogsOperation] flushing logs to logging service.
      2008-02-11 11:05:02,412 DEBUG [org.jbpm.svc.save.CascadeSaveOperation] cascading save of 'org.jbpm.graph.exe.ProcessInstance@14a7b0c'
      2008-02-11 11:05:02,412 DEBUG [org.jbpm.db.JobSession] deleting timer(Buffer period,08-02-11 11:05:00,653,Token: 90)
      2008-02-11 11:05:02,412 DEBUG [org.jbpm.JbpmContext] closing jbpmContext org.jbpm.JbpmContext@108d20b
      2008-02-11 11:05:02,412 DEBUG [org.jbpm.svc.Services] closing service 'persistence': org.jbpm.persistence.db.DbPersistenceService@108d348
      2008-02-11 11:05:02,427 DEBUG [org.jbpm.persistence.db.DbPersistenceService] flushing hibernate session SessionImpl(PersistenceContext[entityKeys=[EntityKey[org.jbpm.graph.log.SignalLog#1411], EntityKey[org.jbpm.graph.log.ProcessInstanceEndLog#1410], EntityKey[org.jbpm.graph.log.TransitionLog#1413], EntityKey[org.jbpm.graph.log.ProcessStateLog#1412], EntityKey[org.jbpm.graph.log.ActionLog#1407], EntityKey[org.jbpm.graph.def.ProcessDefinition#996], EntityKey[org.jbpm.graph.log.TransitionLog#1406], EntityKey[org.jbpm.context.log.variableinstance.StringUpdateLog#1409], EntityKey[org.jbpm.context.log.VariableCreateLog#1408], EntityKey[org.jbpm.graph.log.TransitionLog#1403], EntityKey[org.jbpm.graph.log.NodeLog#1402], EntityKey[org.jbpm.graph.log.NodeLog#1405], EntityKey[org.jbpm.graph.log.ActionLog#1404], EntityKey[org.jbpm.graph.log.ActionLog#1399], EntityKey[org.jbpm.graph.log.ActionLog#1398], EntityKey[org.jbpm.graph.log.TransitionLog#1401], EntityKey[org.jbpm.graph.log.NodeLog#1400], EntityKey[org.jbpm.graph.def.Action#5456], EntityKey[org.jbpm.graph.exe.ProcessInstance#56], EntityKey[org.jbpm.graph.def.Event#2346], EntityKey[org.jbpm.graph.def.Event#2345], EntityKey[org.jbpm.graph.def.Event#2348], EntityKey[org.jbpm.graph.exe.ProcessInstance#55], EntityKey[org.jbpm.graph.def.Action#5445], EntityKey[org.jbpm.graph.def.Action#5447], EntityKey[org.jbpm.graph.def.Action#5442], EntityKey[org.jbpm.graph.def.Action#5444], EntityKey[org.jbpm.graph.def.Transition#16612], EntityKey[org.jbpm.graph.def.Transition#16611], EntityKey[org.jbpm.context.exe.TokenVariableMap#55], EntityKey[org.jbpm.context.exe.TokenVariableMap#56], EntityKey[org.jbpm.graph.def.Transition#16603], EntityKey[org.jbpm.graph.def.Event#2353], EntityKey[org.jbpm.context.log.variableinstance.StringUpdateLog#1418], EntityKey[org.jbpm.graph.log.ProcessInstanceEndLog#1419], EntityKey[org.jbpm.graph.log.ActionLog#1416], EntityKey[org.jbpm.context.log.VariableCreateLog#1417], EntityKey[org.jbpm.graph.log.NodeLog#1414], EntityKey[org.jbpm.context.def.VariableAccess#3131], EntityKey[org.jbpm.graph.log.TransitionLog#1415], EntityKey[org.jbpm.context.def.VariableAccess#3130], EntityKey[org.jbpm.graph.exe.Token#89], EntityKey[org.jbpm.graph.exe.Token#90], EntityKey[org.jbpm.graph.def.Node#12781], EntityKey[org.jbpm.graph.def.Node#12787], EntityKey[org.jbpm.graph.def.Transition#16569], EntityKey[org.jbpm.graph.def.Transition#16570], EntityKey[org.jbpm.graph.def.Transition#16571], EntityKey[org.jbpm.graph.exe.Token#87], EntityKey[org.jbpm.graph.def.Transition#16572], EntityKey[org.jbpm.job.Job#26], EntityKey[org.jbpm.graph.exe.Token#88], EntityKey[org.jbpm.taskmgmt.exe.TaskInstance#56], EntityKey[org.jbpm.graph.node.State#12758], EntityKey[org.jbpm.graph.def.Node#12759], EntityKey[org.jbpm.graph.def.Node#12760], EntityKey[org.jbpm.graph.def.Node#12762], EntityKey[org.jbpm.module.exe.ModuleInstance#109], EntityKey[org.jbpm.module.exe.ModuleInstance#110], EntityKey[org.jbpm.context.exe.variableinstance.StringInstance#120], EntityKey[org.jbpm.context.exe.variableinstance.StringInstance#119], EntityKey[org.jbpm.context.exe.VariableInstance#118], EntityKey[org.jbpm.context.exe.VariableInstance#117], EntityKey[org.jbpm.module.exe.ModuleInstance#111], EntityKey[org.jbpm.module.exe.ModuleInstance#112], EntityKey[org.jbpm.context.exe.VariableInstance#116], EntityKey[org.jbpm.context.exe.VariableInstance#115], EntityKey[org.jbpm.graph.def.ProcessDefinition#997], EntityKey[org.jbpm.graph.def.Node#12789]],collectionKeys=[CollectionKey[org.jbpm.graph.def.ProcessDefinition.events#996], CollectionKey[org.jbpm.graph.exe.Token.children#87], CollectionKey[org.jbpm.graph.node.ProcessState.variableAccesses#12781], CollectionKey[org.jbpm.graph.def.ProcessDefinition.events#997], CollectionKey[org.jbpm.graph.def.Transition.exceptionHandlers#16603], CollectionKey[org.jbpm.graph.exe.Token.children#90], CollectionKey[org.jbpm.graph.exe.Token.children#89], CollectionKey[org.jbpm.graph.exe.Token.children#88], CollectionKey[org.jbpm.graph.def.Transition.exceptionHandlers#16611], CollectionKey[org.jbpm.graph.def.Node.leavingTransitions#12781], CollectionKey[org.jbpm.graph.def.Node.leavingTransitions#12787], CollectionKey[org.jbpm.graph.def.Node.arrivingTransitions#12781], CollectionKey[org.jbpm.graph.def.Transition.events#16603], CollectionKey[org.jbpm.graph.def.Node.leavingTransitions#12789], CollectionKey[org.jbpm.graph.def.Node.arrivingTransitions#12789], CollectionKey[org.jbpm.graph.def.Transition.events#16612], CollectionKey[org.jbpm.graph.def.Transition.events#16611], CollectionKey[org.jbpm.graph.def.Node.arrivingTransitions#12787], CollectionKey[org.jbpm.context.exe.ContextInstance.tokenVariableMaps#111], CollectionKey[org.jbpm.graph.def.Event.actions#2345], CollectionKey[org.jbpm.graph.def.Node.arrivingTransitions#12762], CollectionKey[org.jbpm.graph.def.Event.actions#2348], CollectionKey[org.jbpm.graph.def.Event.actions#2346], CollectionKey[org.jbpm.graph.def.Event.actions#2353], CollectionKey[org.jbpm.taskmgmt.exe.TaskMgmtInstance.taskInstances#110], CollectionKey[org.jbpm.graph.def.Transition.events#16570], CollectionKey[org.jbpm.graph.def.Transition.exceptionHandlers#16612], CollectionKey[org.jbpm.graph.def.Transition.events#16569], CollectionKey[org.jbpm.graph.def.Transition.events#16572], CollectionKey[org.jbpm.graph.def.Transition.events#16571], CollectionKey[org.jbpm.graph.exe.Token.comments#88], CollectionKey[org.jbpm.graph.def.Node.arrivingTransitions#12760], CollectionKey[org.jbpm.graph.def.Node.arrivingTransitions#12759], CollectionKey[org.jbpm.graph.exe.Token.comments#87], CollectionKey[org.jbpm.graph.def.Node.arrivingTransitions#12758], CollectionKey[org.jbpm.graph.exe.Token.comments#90], CollectionKey[org.jbpm.graph.exe.Token.comments#89], CollectionKey[org.jbpm.graph.def.ProcessDefinition.nodes#996], CollectionKey[org.jbpm.graph.def.ProcessDefinition.nodes#997], CollectionKey[org.jbpm.context.exe.ContextInstance.tokenVariableMaps#109], CollectionKey[org.jbpm.graph.def.ProcessDefinition.exceptionHandlers#996], CollectionKey[org.jbpm.graph.def.ProcessDefinition.exceptionHandlers#997], CollectionKey[org.jbpm.taskmgmt.exe.TaskInstance.pooledActors#56], CollectionKey[org.jbpm.graph.node.Decision.decisionConditions#12760], CollectionKey[org.jbpm.graph.node.Decision.decisionConditions#12789], CollectionKey[org.jbpm.taskmgmt.exe.TaskMgmtInstance.swimlaneInstances#110], CollectionKey[org.jbpm.taskmgmt.exe.TaskMgmtInstance.swimlaneInstances#112], CollectionKey[org.jbpm.taskmgmt.exe.TaskMgmtInstance.taskInstances#112], CollectionKey[org.jbpm.context.exe.TokenVariableMap.variableInstances#56], CollectionKey[org.jbpm.graph.def.Node.exceptionHandlers#12759], CollectionKey[org.jbpm.graph.def.Node.exceptionHandlers#12760], CollectionKey[org.jbpm.context.exe.TokenVariableMap.variableInstances#55], CollectionKey[org.jbpm.graph.def.Node.exceptionHandlers#12762], CollectionKey[org.jbpm.graph.def.Node.exceptionHandlers#12758], CollectionKey[org.jbpm.graph.def.Node.events#12787], CollectionKey[org.jbpm.graph.def.ProcessDefinition.actions#996], CollectionKey[org.jbpm.graph.def.ProcessDefinition.actions#997], CollectionKey[org.jbpm.graph.def.Node.events#12789], CollectionKey[org.jbpm.graph.def.Transition.exceptionHandlers#16569], CollectionKey[org.jbpm.graph.def.Node.exceptionHandlers#12781], CollectionKey[org.jbpm.graph.def.Transition.exceptionHandlers#16570], CollectionKey[org.jbpm.graph.def.Transition.exceptionHandlers#16571], CollectionKey[org.jbpm.graph.def.Transition.exceptionHandlers#16572], CollectionKey[org.jbpm.graph.def.Node.events#12781], CollectionKey[org.jbpm.taskmgmt.exe.TaskInstance.comments#56], CollectionKey[org.jbpm.graph.exe.ProcessInstance.runtimeActions#55], CollectionKey[org.jbpm.graph.exe.ProcessInstance.runtimeActions#56], CollectionKey[org.jbpm.taskmgmt.exe.TaskInstance.variableInstances#56], CollectionKey[org.jbpm.graph.def.Node.leavingTransitions#12762], CollectionKey[org.jbpm.graph.def.ProcessDefinition.definitions#997], CollectionKey[org.jbpm.graph.exe.ProcessInstance.instances#55], CollectionKey[org.jbpm.graph.def.ProcessDefinition.definitions#996], CollectionKey[org.jbpm.graph.exe.ProcessInstance.instances#56], CollectionKey[org.jbpm.graph.def.Node.leavingTransitions#12758], CollectionKey[org.jbpm.graph.def.Node.events#12762], CollectionKey[org.jbpm.graph.def.Node.leavingTransitions#12760], CollectionKey[org.jbpm.graph.def.Node.leavingTransitions#12759], CollectionKey[org.jbpm.graph.def.Node.exceptionHandlers#12789], CollectionKey[org.jbpm.graph.def.Node.events#12758], CollectionKey[org.jbpm.graph.def.Node.events#12759], CollectionKey[org.jbpm.graph.def.Node.exceptionHandlers#12787], CollectionKey[org.jbpm.graph.def.Node.events#12760]]];ActionQueue[insertions=[] updates=[] deletions=[EntityDeleteAction[org.jbpm.job.Timer#26]] collectionCreations=[] collectionRemovals=[] collectionUpdates=[]])
      2008-02-11 11:05:02,427 ERROR [org.hibernate.event.def.AbstractFlushingEventListener] 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.jbpm.job.Timer#26]
       at org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:1761)
       at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2519)
       at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2693)
       at org.hibernate.action.EntityDeleteAction.execute(EntityDeleteAction.java:74)
       at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
       at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:232)
       at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:144)
       at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
       at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
       at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
       at org.jbpm.persistence.db.DbPersistenceService.flushSession(DbPersistenceService.java:272)
       at org.jbpm.persistence.db.DbPersistenceService.close(DbPersistenceService.java:232)
       at org.jbpm.svc.Services.close(Services.java:224)
       at org.jbpm.JbpmContext.close(JbpmContext.java:139)
       at org.jbpm.job.executor.JobExecutorThread.executeJob(JobExecutorThread.java:193)
       at org.jbpm.job.executor.JobExecutorThread.run(JobExecutorThread.java:64)
      2008-02-11 11:05:02,443 ERROR [org.jbpm.persistence.db.DbPersistenceService] hibernate flush failed
      org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [org.jbpm.job.Timer#26]
       at org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:1761)
       at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2519)
       at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2693)
       at org.hibernate.action.EntityDeleteAction.execute(EntityDeleteAction.java:74)
       at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
       at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:232)
       at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:144)
       at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
       at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
       at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
       at org.jbpm.persistence.db.DbPersistenceService.flushSession(DbPersistenceService.java:272)
       at org.jbpm.persistence.db.DbPersistenceService.close(DbPersistenceService.java:232)
       at org.jbpm.svc.Services.close(Services.java:224)
       at org.jbpm.JbpmContext.close(JbpmContext.java:139)
       at org.jbpm.job.executor.JobExecutorThread.executeJob(JobExecutorThread.java:193)
       at org.jbpm.job.executor.JobExecutorThread.run(JobExecutorThread.java:64)
      2008-02-11 11:05:02,458 DEBUG [org.jbpm.persistence.db.DbPersistenceService] rolling back hibernate transaction
      2008-02-11 11:05:02,458 ERROR [org.jbpm.persistence.db.DbPersistenceService] hibernate rollback failed
      java.lang.NullPointerException
       at org.jbpm.persistence.db.DbPersistenceService.rollback(DbPersistenceService.java:304)
       at org.jbpm.persistence.db.DbPersistenceService.close(DbPersistenceService.java:234)
       at org.jbpm.svc.Services.close(Services.java:224)
       at org.jbpm.JbpmContext.close(JbpmContext.java:139)
       at org.jbpm.job.executor.JobExecutorThread.executeJob(JobExecutorThread.java:193)
       at org.jbpm.job.executor.JobExecutorThread.run(JobExecutorThread.java:64)
      


      Any ideas on how to avoid/ solve this problem? Any suggestions or comments would be gratefully received.

      Many thanks, Peter.