0 Replies Latest reply on Jun 25, 2008 8:31 AM by Luis Miguel Rodriguez

    Row was updated or deleted by another transaction

    Luis Miguel Rodriguez Newbie

      Hi,

      I am using the jbpm console for orchestrate my process definition. However, some of the process nodes request asynchronous tasks to external systems. When those tasks finish, the workflow engine receives an incoming message through JMS (openMQ). What I'm currently doing in response to that message is just to signal the root token to the next node:

      try {
      
       MapMessage mapMessage = (MapMessage)message;
       JbpmConfiguration conf = JbpmConfiguration.getInstance();
       JbpmContext ctx = conf.createJbpmContext();
       try {
      
       ProcessInstance processInstance = ctx.loadProcessInstanceForUpdate(Long.parseLong(mapMessage.getString("processInstance")));
       processInstance.getRootToken().signal();
      
       }finally {
       ctx.close();
       }
      
      


      It works but I'm getting this obvious exception:

      ERROR - AbstractFlushingEventListener.performExecutions(301) | 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.graph.exe.Token#64]
       at org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:1769)
       at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2412)
       at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2312)
       at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2612)
       at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:96)
       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:298)
       at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
       at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
       at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
       at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
       at org.jbpm.persistence.db.DbPersistenceService.commit(DbPersistenceService.java:256)
       at org.jbpm.persistence.db.DbPersistenceService.close(DbPersistenceService.java:214)
       at org.jbpm.svc.Services.close(Services.java:225)
       at org.jbpm.JbpmContext.close(JbpmContext.java:139)
       at com.marketsentinel.workflow.messaging.MessageListener.onMessage(MessageListener.java:42)
       at com.sun.messaging.jmq.jmsclient.MessageConsumerImpl.deliverAndAcknowledge(MessageConsumerImpl.java:338)
       at com.sun.messaging.jmq.jmsclient.MessageConsumerImpl.onMessageToListenerFromReceiveQueue(MessageConsumerImpl.java:316)
       at com.sun.messaging.jmq.jmsclient.SessionReader.onMessageToLateListeners(SessionReader.java:171)
       at com.sun.messaging.jmq.jmsclient.SessionReader.deliver(SessionReader.java:149)
       at com.sun.messaging.jmq.jmsclient.ConsumerReader.run(ConsumerReader.java:189)
       at java.lang.Thread.run(Thread.java
      


      Since I'm creating a new different hibernate session/Jbpm context from the message listener. I wonder how could I get the JbpmContext used by the console in order to use the same session to update the token status.

      I've been searching the jbpm4jsf source code and all the action classes use a static "context" . Where does that object is instanciated?

      Thanks.