2 Replies Latest reply on Sep 3, 2009 7:03 AM by erkin kanlioglu

    How to trigger Sub-process from custom state recursively?

    erkin kanlioglu Newbie

      Hi All

      I have started working jbpm recently. I'm trying to realise following scenario with jbpm. Any help is appreciated.

      Start points to a custom activity which requests an XML file from external source.
      If file exists, next custom activity starts streaming it. At this point, I would like trigger rest of the logic (sub-process?) recursively for each piece of data from streaming.

      So, How can I start/trigger execution of sub-processes asynchronously from a custom activity with some data?

      Thanks



        • 1. Re: How to trigger Sub-process from custom state recursively
          Ronald van Kuijk Master

          look/search at the 'foreach' example (for jbpm3 ) in the wiki. Instead of multiple tasks, just start multiple subprocesses.

          • 2. Re: How to trigger Sub-process from custom state recursively
            erkin kanlioglu Newbie

            Hi Ronald

            Thanks for advice... I re-implemented ForEachFork and ForEachJoin for jbpm4 by using the code in ForkActivity and JoinActivity. Instead of using sub-process I used "group".
            I tried to execute "groups" concurrently in the fork by labeling them with "continue=async".
            But it created a lot of database level problems.
            Then, I decided to test this with original JBPM functionality but again I got exceptions.

            My question is --> Is there a way to execute "groups" async with Fork-Join or Do you suggest something else?


            Please check following information.


            <?xml version="1.0" encoding="UTF-8"?>
            
            <process name="testForkJoin" xmlns="http://jbpm.org/4.0/jpdl">
            
             <start name="start1" g="255,53,48,48">
             <transition name="to state1" to="state1" g="-63,-22" />
             </start>
            
             <custom g="198,134,157,52" name="state1" class="com.actions.RandomActivity">
             <transition to="fork1" g="-52,-22" />
             </custom>
            
             <fork name="fork1" g="252,291,48,48">
             <transition name="to state2" to="state2" g="-63,-22" />
             <transition name="to state3" to="state3" g="-63,-22" />
             </fork>
            
             <group name="state2">
             <start>
             <transition to="state4" />
             </start>
            
             <custom g="198,134,157,52" name="state4" class="com.actions.RandomActivity" continue="async">
             <transition to="groupDone1" g="-52,-22" />
             </custom>
            
             <end name="groupDone1" />
             <transition to="join1" />
             </group>
            
             <group name="state3" continue="async">
             <start>
             <transition to="state5" />
             </start>
            
             <custom g="198,134,157,52" name="state5" class="com.actions.RandomActivity" continue="async">
             <transition to="groupDone2" g="-52,-22" />
             </custom>
            
             <end name="groupDone2" />
             <transition to="join1" />
             </group>
            
            
             <join name="join1" g="256,461,48,48">
             <transition name="to end1" to="end1" g="-54,-22" />
             </join>
             <end name="end1" g="263,568,48,48" />
            </process>
            


            and Simple RandomActivity
            public void execute(ActivityExecution ae) throws Exception {
             System.out.println("in random activity");
             for(int i=0; i < 10; i++){
             Thread.sleep(10);
             System.out.println(Thread.currentThread().getName()+":"+i);
             }
            }
            



            Here is the exception

            SEVERE: 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.pvm.internal.model.ExecutionImpl#3]
            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.jbpm.pvm.internal.tx.HibernateSessionResource.prepare(HibernateSessionResource.java:54)
            at org.jbpm.pvm.internal.tx.StandardTransaction.commit(StandardTransaction.java:106)
            at org.jbpm.pvm.internal.tx.StandardTransaction.complete(StandardTransaction.java:65)
            at org.jbpm.pvm.internal.tx.StandardTransactionInterceptor.execute(StandardTransactionInterceptor.java:61)
            at org.jbpm.pvm.internal.svc.EnvironmentInterceptor.execute(EnvironmentInterceptor.java:54)
            at org.jbpm.pvm.internal.svc.RetryInterceptor.execute(RetryInterceptor.java:55)
            at org.jbpm.pvm.internal.svc.ExecutionServiceImpl.startProcessInstanceByKey(ExecutionServiceImpl.java:70)
            at com.playphone.alexander.afp.workFlowProcessor.TestWorkFlow.testForkJoinGroup(TestWorkFlow.java:63)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:597)
            at junit.framework.TestCase.runTest(TestCase.java:154)
            at junit.framework.TestCase.runBare(TestCase.java:127)
            at junit.framework.TestResult$1.protect(TestResult.java:106)
            at junit.framework.TestResult.runProtected(TestResult.java:124)
            at junit.framework.TestResult.run(TestResult.java:109)
            at junit.framework.TestCase.run(TestCase.java:118)
            at junit.framework.TestSuite.runTest(TestSuite.java:208)
            at junit.framework.TestSuite.run(TestSuite.java:203)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:597)
            at org.apache.maven.surefire.junit.JUnitTestSet.execute(JUnitTestSet.java:213)
            at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140)
            at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127)
            at org.apache.maven.surefire.Surefire.run(Surefire.java:177)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:597)
            at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:345)
            at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1009)