持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
1.RuntimeService
RuntimeService 用于启动流程定义的新流程实例,也用于读取与存储流程变量
。流程变量是流程实例中的数据,可以在流程的许多地方使用(例如排他网关经常使用流程变量判断流程下一步要走的路径)。RuntimeService
还可以用于查询流程实例与执行(Execution)。执行也就是BPMN 2.0中 'token'
的概念。通常执行是指向流程实例当前位置的指针。最后,还可以在流程实例等待外部触发时使用RuntimeService
,使流程可以继续运行。流程有许多等待状态(wait states)
,RuntimeService
服务提供了许多操作用于“通知”流程实例:已经接收到外部触发,流程实例可以继续运行。
1.0准备流程文件
这里为了简单的测试 发起人和审批人都是写死的
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.flowable.org/processdef">
<process id="leave_key" name="小龙猫请假流程" isExecutable="true">
<documentation>请假测试</documentation>
<startEvent id="startEvent1" flowable:formFieldValidation="true"></startEvent>
<userTask id="sid-97A57F70-08DC-444E-BC1E-0BECB6E2ABFA" name="员工请假" flowable:assignee="zhangsan" flowable:formFieldValidation="true">
<extensionElements>
<modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements>
</userTask>
<sequenceFlow id="sid-765D3642-F5E0-41FA-AA06-7DF038FD31E1" sourceRef="startEvent1" targetRef="sid-97A57F70-08DC-444E-BC1E-0BECB6E2ABFA"></sequenceFlow>
<userTask id="sid-0A047298-8229-4DF7-AE2A-47AFFF84B975" name="经理审批" flowable:assignee="lisi" flowable:formFieldValidation="true">
<extensionElements>
<modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements>
</userTask>
<sequenceFlow id="sid-81DBBA63-898A-4176-9426-B34FC271D20C" sourceRef="sid-97A57F70-08DC-444E-BC1E-0BECB6E2ABFA" targetRef="sid-0A047298-8229-4DF7-AE2A-47AFFF84B975"></sequenceFlow>
<endEvent id="sid-FF2340BF-AA6A-4FEC-A670-08298BC1A9B7"></endEvent>
<sequenceFlow id="sid-56709B2A-5C9B-4995-8CC6-96070D0A8F5B" sourceRef="sid-0A047298-8229-4DF7-AE2A-47AFFF84B975" targetRef="sid-FF2340BF-AA6A-4FEC-A670-08298BC1A9B7"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_leave_key">
<bpmndi:BPMNPlane bpmnElement="leave_key" id="BPMNPlane_leave_key">
<bpmndi:BPMNShape bpmnElement="startEvent1" id="BPMNShape_startEvent1">
<omgdc:Bounds height="30.0" width="30.0" x="100.0" y="163.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-97A57F70-08DC-444E-BC1E-0BECB6E2ABFA" id="BPMNShape_sid-97A57F70-08DC-444E-BC1E-0BECB6E2ABFA">
<omgdc:Bounds height="80.0" width="100.0" x="175.0" y="138.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-0A047298-8229-4DF7-AE2A-47AFFF84B975" id="BPMNShape_sid-0A047298-8229-4DF7-AE2A-47AFFF84B975">
<omgdc:Bounds height="80.0" width="100.0" x="320.0" y="138.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-FF2340BF-AA6A-4FEC-A670-08298BC1A9B7" id="BPMNShape_sid-FF2340BF-AA6A-4FEC-A670-08298BC1A9B7">
<omgdc:Bounds height="28.0" width="28.0" x="465.0" y="164.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sid-765D3642-F5E0-41FA-AA06-7DF038FD31E1" id="BPMNEdge_sid-765D3642-F5E0-41FA-AA06-7DF038FD31E1">
<omgdi:waypoint x="129.9499984899576" y="178.0"></omgdi:waypoint>
<omgdi:waypoint x="174.9999999999917" y="178.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-81DBBA63-898A-4176-9426-B34FC271D20C" id="BPMNEdge_sid-81DBBA63-898A-4176-9426-B34FC271D20C">
<omgdi:waypoint x="274.9499999999907" y="178.0"></omgdi:waypoint>
<omgdi:waypoint x="319.9999999999807" y="178.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-56709B2A-5C9B-4995-8CC6-96070D0A8F5B" id="BPMNEdge_sid-56709B2A-5C9B-4995-8CC6-96070D0A8F5B">
<omgdi:waypoint x="419.95000000000005" y="178.0"></omgdi:waypoint>
<omgdi:waypoint x="465.0" y="178.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
1.1我们部署一个流程
@Test
public void DeployProcess(){
Deployment holiday = repositoryService.createDeployment()
.addClasspathResource("小龙猫请假流程.bpmn20.xml")
.name("小龙猫请假流程")
.deploy();
}
1.2 启动这个流程
@Test
public void StatrProcess(){
//先查到流程
ProcessDefinition leave_key = repositoryService.createProcessDefinitionQuery().processDefinitionKey("leave_key").singleResult();
//启动流程并分配给 zhangsan
ProcessInstance processInstance = runtimeService.startProcessInstanceById(leave_key.getId(), "zhangsan");
}
分配完成后我们可以去DB 查看 ACT_RU_TASK
和ACT_HI_PROCINST
可以看到流程流转到 zhangsan
2 TaskService
- 查询分派给用户或组的任务
- 创建独立运行(standalone) 任务。这是一种没有关联到流程实例的任务。
- 决定任务的执行用户(assignee),或者将用户通过某种方式与任务关联。
- 认领(claim)与完成(complete)任务。认领是指某人决定成为任务的执行用户,也即他将会完成这个任务。完成任务是指“做这个任务要求的工作”,通常是填写某个表单。
2.1 使用zhangsan完成任务
@Test
public void comleteProcess(){
Task task = taskService.createTaskQuery()
//ACT_RU_TASK 表中 PROC_INST_ID_
.processInstanceId("c1580abc-dcfa-11ec-a6a5-666ee0fc370d")
.taskAssignee("zhangsan")
.singleResult();
if (task!=null){
//这里直接完成是因为我们这个流程是的候选用户写死的
taskService.complete(task.getId());
System.out.println("完成");
//去 历史表中查看
}
}
zhangsan完成了任务会流转到 到经理lisi节点去
可以清楚的看到 员工请假已经结束流转到了 lisi 经理审批
2.2 使用lisi完成任务
//这里和上面一样 先用李四和 任务ID查出来 自己的任务 进行完成
@Test
public void comleteProcess(){
Task task = taskService.createTaskQuery()
//ACT_RU_TASK 表中 PROC_INST_ID_
.processInstanceId("c1580abc-dcfa-11ec-a6a5-666ee0fc370d")
.taskAssignee("lisi")
.singleResult();
if (task!=null){
taskService.complete(task.getId());
System.out.println("完成");
}
}
可以看到 lisi经理审批已经完成。
同时流程完全结束后
ACT_RU_TASK
表中就没有数据了 要去 HistoryService
API查询历史数据了
到这 简单的测试就完成从 部署-->启动 -->审批-->完成 当然这两个 API还有其他的方法这里就不多做展示了😀