您的位置:首页 > 产品设计 > 产品经理

jBPM4.4开发(四)-----------sub-process节点

2012-07-04 22:40 302 查看







子流程

创建一个子流程实例后等待直到它完成。当子流程实例完成后,父流程的流向就会继续。

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息