[jboss-user] [JBoss jBPM] - Re: Timers and JBPM 3.2.1

luukey do-not-reply at jboss.com
Sat Jul 21 07:59:59 EDT 2007


You mean to clean the orphans ? OK. But how to correctly create a new entries ? I found, that the transaction must be commited after the ProcessInstance has been signaled, e.g. in the example above:
// ...init code
  | ProcessInstance pInst = ctx.newProcessInstance("test1");
  | pInst.signal();
  | ctx.getSession().getTransaction().commit();
  | // ... some other code. Now, the threads of the JobExecutor are able to find the timer, and run it, but the transaction now is commited, which leads to the following problems:
Let's assume now, a more complicated flow:<?xml version="1.0" encoding="UTF-8"?>
  | 
  | <process-definition
  |   xmlns="urn:jbpm.org:jpdl-3.2"  name="test1">
  | 	<start-state name="start-state1">
  | 		<transition to="state1" name="to_state1"></transition>
  | 	</start-state>
  | 	<state name="state1">
  | 		<timer duedate="2 seconds" name="first_timer" repeat="2 seconds">
  | 			<action class="test1.TimerActionHandler"></action>
  | 		</timer>
  | 		<transition to="state2" name="to_state2"></transition>
  | 		<!-- <transition to="state1" name="to_state1"></transition> -->
  | 	</state>
  | 
  | 	<state name="state2">
  | 		<timer duedate="5 seconds" name="second_timer" repeat="2 seconds">
  | 			<action class="test1.TimerActionHandler"></action>
  | 		</timer>
  | 		<transition to="end-state1" name="to_end"></transition>
  | 	</state>
  | 
  | 
  | 	<end-state name="end-state1"></end-state>
  | </process-definition>Now we have two timers, needed to start one after another. The first_timer stops, the second_timer starts. Let's see the code:// ...init code
  | ProcessInstance pInst = ctx.newProcessInstance("test1");
  | pInst.signal();       
  | ctx.getSession().getTransaction().commit();
  | System.in.read(); // we're just waiting for the enter....the first_timer is running
  | pInst.signal(); // we move to the next node....in the hope of stopping first and starting second
  | System.in.read(); // ...but nothing happens
  | //....

OK, adding one more commit, e.g:pInst.signal();       
  |         ctx.getSession().getTransaction().commit();
  |         System.in.read();
  |         pInst.signal();
  |         ctx.getSession().getTransaction().commit();
  |         System.in.read();leads to the TransactionException, which is pretty obvious:org.hibernate.TransactionException: Transaction not successfully started
  | 	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:100)
  | 	at Test2.main(Test2.java:41)

Beginning a new transaction, however, raises the StaleObjectStateException: // ....
  | ProcessInstance pInst = ctx.newProcessInstance("test1");
  |       
  |         pInst.signal();       
  |         ctx.getSession().getTransaction().commit();
  |         System.in.read();
  |         ctx.getSession().getTransaction().begin();
  |         pInst.signal();
  |         ctx.getSession().getTransaction().commit();
  |         System.in.read();
  | //....
13:36:40,736 [main] ERROR 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.graph.exe.Token#3601]
  | 	at org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:1765)
which is probably realted to the fact, that the JobExecutor is still running in the background and locking the table with the long transaction (I guess).
So the question remains: how the process definitions with timers should be deployed without the jbpm-console, to run as they should ?

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4066396#4066396

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4066396



More information about the jboss-user mailing list