jBPM4.4開發(四)-----------sub-process節點






子流程

創建一個子流程實例後等待直到它完成。當子流程實例完成後,父流程的流向就會繼續。

1.子流程變量

向子流程傳遞信息我們需要用到變量parameter-in和parameter-out,其屬性var和subvar分別代表父流程變量和子流程變量。parameter-in中var代表將父流程變量傳遞到subvar子流程變量中;parameter-out中var代表父流程變量讀取子流程變量subvar。

Demo:父流程:ProcessDocument.jpdl.xml

<?xml version="1.0" encoding="UTF-8"?>

<process name="ProcessDocument" xmlns="http://jbpm.org/4.4/jpdl">
   <start g="58,125,48,48" name="start1">
      <transition g="-21,-12" name="to review" to="review"/>
   </start>
   <sub-process g="160,121,92,52" name="review" sub-process-key="SubProcessReview">
   	  <parameter-in var="document" subvar="subDocument" />
   	  <parameter-out var="result" subvar="subResult" />
      <transition g="-27,-16" name="to wait" to="wait"/>
   </sub-process>
   <state g="293,118,92,52" name="wait"/>
</process>

子流程:SubProcessReview.jpdl.xml

<?xml version="1.0" encoding="UTF-8"?>

<process name="SubProcessReview" xmlns="http://jbpm.org/4.4/jpdl">
   <start g="19,113,48,48" name="start1">
      <transition g="-45,-20" name="to get approvel" to="get approvel"/>
   </start>
   <task assignee="#{subDocument}" g="158,111,92,52" name="get approvel">
      <transition g="-28,-16" name="to end1" to="end1"/>
   </task>
   <end g="316,116,48,48" name="end1"/>
</process>
測試類:TestSubProcess.java

package com.itstudio.jbpm.subprocess.demo;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jbpm.api.Configuration;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.IdentityService;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.RepositoryService;
import org.jbpm.api.TaskService;
import org.jbpm.api.task.Task;

public class TestSubProcess {
	
	public static final Configuration configuration = new Configuration();
	public static final ProcessEngine processEngine=configuration.buildProcessEngine();
	public static final RepositoryService repositoryService= processEngine.getRepositoryService();
	public static final ExecutionService executionService=processEngine.getExecutionService();
	public static final TaskService taskService=processEngine.getTaskService();

	public void deploy(){//發佈流程
		repositoryService.createDeployment()
		.addResourceFromClasspath("com/itstudio/jbpm/subprocess/demo/ProcessDocument.jpdl.xml")
			.deploy();
		System.out.println("父流程發佈成功!");
		repositoryService.createDeployment()
		.addResourceFromClasspath("com/itstudio/jbpm/subprocess/demo/SubProcessReview.jpdl.xml")
			.deploy();
	System.out.println("子流程發佈成功!");
	}
	
	public void test(){//測試

		Map<String, Object> variables = new HashMap<String, Object>();
	    variables.put("document", "sometext");
	    
	    ProcessInstance processInstance = executionService
	        .startProcessInstanceByKey("ProcessDocument", variables);
	    //顯示節點是否在review處
	    System.out.println(processInstance.findActiveActivityNames());

	    List<Task> taskList = taskService.findPersonalTasks("sometext");
	    Task task = taskList.get(0);
	    System.out.println("task name:"+task.getActivityName()+'\n'+"task assignee:"+task.getAssignee());
	    
	    Map<String, Object> map = new HashMap<String, Object>();
	    map.put("subResult", "accept");
	    taskService.setVariables(task.getId(), map);
	    taskService.completeTask(task.getId());
	    
	    processInstance = executionService.findProcessInstanceById(processInstance.getId());
	    //顯示節點是否爲wait
	    System.out.println("此時節點名字:"+processInstance.findActiveActivityNames());

	    String result = (String) executionService.getVariable(processInstance.getId(), "result");
	    //顯示result是否爲accept
	    System.out.println("此時父流程變量var爲:"+result);
	}
	
	public static void main(String[] args) {
		TestSubProcess demo = new TestSubProcess();
		demo.deploy();
		demo.test();
	}

}

2.子流程轉向父流程不同節點

我們只需給sub-process節點增加transition,並且賦予每個transition唯一的名稱。在子流程中定義多個結束節點(end),每個結束節點的名稱分別對應父流程transition的名稱,這樣子流程就會按照end對應的transition名稱流轉父流程。

Demo2:
父流程:ProcessDocument2.jpdl.xml

<?xml version="1.0" encoding="UTF-8"?>

<process name="ProcessDocument2" xmlns="http://jbpm.org/4.4/jpdl">
   <start g="17,124,48,48" name="start1">
      <transition g="-28,-20" name="to review" to="review"/>
   </start>
   <sub-process g="103,125,92,52" name="review" sub-process-key="SubProcessReview2">
      <transition g="150,79:15,-18" name="ok" to="next step"/>
      <transition g="-28,-18" name="nok" to="update"/>
      <transition g="150,221:23,-18" name="reject" to="close"/>
   </sub-process>
   <state g="263,54,92,52" name="next step"/>
   <state g="264,129,92,52" name="update"/>
   <state g="264,196,92,52" name="close"/>
</process>

子流程:SubProcessReview2.jpdl.xml


<?xml version="1.0" encoding="UTF-8"?>

<process name="SubProcessReview2" xmlns="http://jbpm.org/4.4/jpdl">
   <start name="start1" g="19,111,48,48">
      <transition name="to get approvel" to="get approvel" g="-48,-21"/>
   </start>
   <task name="get approvel" g="139,110,92,52" assignee="johndoe">
      <transition name="ok" to="ok" g="182,81:47,-16"/>
      <transition name="nok" to="nok" g="-18,-20"/>
      <transition name="reject" to="reject" g="185,202:31,-17"/>
   </task>
   <end name="ok" g="300,58,48,48"/>
   <end name="nok" g="301,112,48,48"/>
   <end name="reject" g="304,178,48,48"/>
</process>
測試類:TestSubProcess2.java
package com.itstudio.jbpm.subprocess.demo;

import java.util.List;

import org.jbpm.api.Configuration;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.IdentityService;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.RepositoryService;
import org.jbpm.api.TaskService;
import org.jbpm.api.task.Task;

public class TestSubProcess2 {

	public static final Configuration configuration = new Configuration();
	public static final ProcessEngine processEngine=configuration.buildProcessEngine();
	public static final RepositoryService repositoryService= processEngine.getRepositoryService();
	public static final ExecutionService executionService=processEngine.getExecutionService();
	public static final TaskService taskService=processEngine.getTaskService();
	
	private void deploy() {
		repositoryService.createDeployment().addResourceFromClasspath("com/itstudio/jbpm/subprocess/demo/ProcessDocument2.jpdl.xml").deploy();
		repositoryService.createDeployment().addResourceFromClasspath("com/itstudio/jbpm/subprocess/demo/SubProcessReview2.jpdl.xml").deploy();
		System.out.println("Successful");
	}
	
	private void test() {
		ProcessInstance processInstance = executionService
        .startProcessInstanceByKey("ProcessDocument2");
		System.out.println("當前節點:"+processInstance.findActiveActivityNames());
		List<Task> taskList = taskService.findPersonalTasks("johndoe");
		Task task = taskList.get(0);
	    System.out.println("task name:"+task.getActivityName()+'\n'+"task assignee:"+task.getAssignee());
	    taskService.completeTask(task.getId(),"ok");
	    processInstance = executionService.findProcessInstanceById(processInstance.getId());
	    //顯示節點是否爲next step
	    System.out.println("此時節點名字:"+processInstance.findActiveActivityNames());
	}
	
	public static void main(String[] args) {
		TestSubProcess2 demo2 = new TestSubProcess2();
		demo2.deploy();
		demo2.test();
	}

}



By Mr.Z




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章