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());//显示节点是否为waitSystem.out.println("此时节点名字:"+processInstance.findActiveActivityNames());String result = (String) executionService.getVariable(processInstance.getId(), "result");//显示result是否为acceptSystem.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 stepSystem.out.println("此时节点名字:"+processInstance.findActiveActivityNames());}public static void main(String[] args) {TestSubProcess2 demo2 = new TestSubProcess2();demo2.deploy();demo2.test();}}
By Mr.Z