0 Replies Latest reply on Feb 25, 2009 6:57 AM by jeffery c

    pvm_subprocess_problems

    jeffery c Newbie

      hi, can anyone help me:
      there is a testcase 'org.jbpm.test.activities.SubProcessTest' in module 'test-pojo' which is run in object-mode.
      and so i try to write a subprocess testcase running in persistent-mode. i have been trying but i can not make it... exception comes out:

      10:37:11,250 SEV | [LazyInitializationException] could not initialize proxy - no Session
      org.hibernate.LazyInitializationException: could not initialize proxy - no Session
       at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57)
       at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
       at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:150)
       at org.jbpm.pvm.internal.model.ActivityImpl$$EnhancerByCGLIB$$fa091528.getParentActivity(<generated>)
       at org.jbpm.pvm.internal.model.ExecutionImpl.initializeScopes(ExecutionImpl.java:210)
       at org.jbpm.pvm.internal.model.ExecutionImpl.start(ExecutionImpl.java:193)
       at org.jbpm.pvm.internal.model.ExecutionImpl.beginSubProcessInstance(ExecutionImpl.java:882)
       at name.galanfish.test.super_sub_process.cmd.StartSubProcessCmd.execute(StartSubProcessCmd.java:33)
       at name.galanfish.test.super_sub_process.cmd.StartSubProcessCmd.execute(StartSubProcessCmd.java:1)
       at org.jbpm.pvm.internal.svc.DefaultCommandService.execute(DefaultCommandService.java:42)
       at org.jbpm.pvm.internal.tx.StandardTransactionInterceptor.execute(StandardTransactionInterceptor.java:54)
       at org.jbpm.pvm.internal.svc.EnvironmentInterceptor.execute(EnvironmentInterceptor.java:40)
       at org.jbpm.pvm.internal.svc.RetryInterceptor.execute(RetryInterceptor.java:52)
       at org.jbpm.pvm.internal.svc.ExecutionServiceImpl.beginSubProcess(ExecutionServiceImpl.java:84)
       at name.galanfish.test.super_sub_process.SubProcess.execute(SubProcess.java:36)
       at org.jbpm.pvm.internal.model.op.ExecuteActivity.perform(ExecuteActivity.java:57)
       at org.jbpm.pvm.internal.model.ExecutionImpl.performAtomicOperationSync(ExecutionImpl.java:587)
       at org.jbpm.pvm.internal.model.ExecutionImpl.performAtomicOperation(ExecutionImpl.java:560)
       at org.jbpm.pvm.internal.model.ExecutionImpl.signal(ExecutionImpl.java:384)
       at org.jbpm.pvm.internal.cmd.SignalCmd.execute(SignalCmd.java:62)
       at org.jbpm.pvm.internal.cmd.SignalCmd.execute(SignalCmd.java:1)
       at org.jbpm.pvm.internal.svc.DefaultCommandService.execute(DefaultCommandService.java:42)
       at org.jbpm.pvm.internal.tx.StandardTransactionInterceptor.execute(StandardTransactionInterceptor.java:54)
       at org.jbpm.pvm.internal.svc.EnvironmentInterceptor.execute(EnvironmentInterceptor.java:40)
       at org.jbpm.pvm.internal.svc.RetryInterceptor.execute(RetryInterceptor.java:52)
       at org.jbpm.pvm.internal.svc.ExecutionServiceImpl.signalExecutionById(ExecutionServiceImpl.java:121)
       at name.galanfish.test.super_sub_process.SuperSubProcessTest.testSimpleSuperSubProcess(SuperSubProcessTest.java:38)
       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:585)
       at junit.framework.TestCase.runTest(TestCase.java:164)
       at org.jbpm.test.BaseJbpmTestCase.runTest(BaseJbpmTestCase.java:81)
       at junit.framework.TestCase.runBare(TestCase.java:130)
       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:120)
       at junit.framework.TestSuite.runTest(TestSuite.java:230)
       at junit.framework.TestSuite.run(TestSuite.java:225)
       at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
       at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
       at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
       at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
       at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
       at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)



      the source code as follow:
      public class SuperSubProcessTest extends EnvironmentFactoryTestCase {
      
       private JbpmConfiguration factory;
       private ProcessServiceImpl processService;
       private ExecutionService executionService;
      
      
       @Override
       protected void setUp() throws Exception {
       super.setUp();
       factory = (JbpmConfiguration) getEnvironmentFactory();
       processService = (ProcessServiceImpl) factory.getProcessService();
       executionService = factory.getExecutionService();
       }
      
       public void testSimpleSuperSubProcess(){
       createAndDeploySimpleSuperSubProcess();
       executionService.startProcessInstanceById("super2:1", "superrequest8");
       executionService.signalExecutionById("super2/superrequest8", "to_one");
       }
      
       private void createAndDeploySimpleSuperSubProcess(){
       ClientProcessDefinition superProcess = ProcessDefinitionBuilder.startProcess("super2")
       .startActivity("start", WaitState.class)
       .initial()
       .transition("one", "to_one")
       .endActivity()
      
       .startActivity("one", AutomaticActivity.class)
       .transition("sub", "to_sub")
       .endActivity()
      
       .startActivity("sub", SubProcess.class)
       .transition("end", "to_end")
       .endActivity()
      
       .startActivity("end", AutomaticActivity.class)
       .endActivity()
       .endProcess();
      
       ClientProcessDefinition subProcess = ProcessDefinitionBuilder.startProcess("sub2")
       .startActivity("start", AutomaticActivity.class)
       .initial()
       .transition("end", "to_end")
       .endActivity()
      
       .startActivity("end", EndState.class)
       .endActivity()
       .endProcess();
      
       deployProcess(superProcess);
       deployProcess(subProcess);
       }
      
       private void deployProcess(ProcessDefinition process){
       Deployment deployment = processService.createDeployment();
       deployment.addObject("process", process);
       processService.deploy(deployment);
       }
      }
      
      public class SubProcess implements ExternalActivityBehaviour{
      
       private static final long serialVersionUID = 1L;
      
       public void signal(ActivityExecution execution, String signalName, Map<String, Object> parameters) throws Exception {
      
       }
      
       public void execute(ActivityExecution execution) throws Exception {
       ProcessService processService = Environment.getFromCurrent(ProcessService.class);
       ClientProcessDefinition subProcess = (ClientProcessDefinition)processService.findLatestProcessDefinitionByKey("sub2"); // hard code
      
       ExecutionService exeService = Environment.getFromCurrent(ExecutionService.class);
       // i add method 'beginSubProcess' in ExecutionService which is to execute the command 'StartSubProcessCmd'(source code as follow)
       Execution subExecution = exeService.beginSubProcess(execution, subProcess, "subrequest1"); // hard code
       if(!subExecution.isEnded()){
       execution.waitForSignal();
       }
       }
      }
      
      public class StartSubProcessCmd extends AbstractCommand<Execution>{
      
       private static final long serialVersionUID = 1L;
      
       private ActivityExecution parentExecution;
       private ProcessDefinition subProcess;
       private String key;
       public StartSubProcessCmd(Execution parentExecution, ProcessDefinition subProcess, String key){
       this.parentExecution = (ActivityExecution)parentExecution;
       this.subProcess = subProcess;
       this.key = key;
       }
      
       public Execution execute(Environment environment) throws Exception {
       ClientExecution subExecution = parentExecution.beginSubProcessInstance((ClientProcessDefinition) subProcess, key);
       return subExecution;
       }
      }


      appreciate!