在用Camunda流程引擎做业务开发时,遇到一些简单的流程不会有什么问题。但如果遇到一套流程涉及到很多节点的时候,并且在主要的流程中不会太占意一些节点时,这样主会把流程拆分为主流程和子流程。
主流程:主要展示主要的步骤节点
子流程:要完成主流程而发起的其它流程
这样拆分的好处:
一:让流程更加清晰
二:流程图易画,并且也简单易理解、不臃肿
三:便于业务拓展
既然拆分流程能带来便于,那Camunda 流程引擎如何嵌套子流程呢?
在Camunda 流程引擎中嵌套子流程的方式有2种:
一:直接使用嵌套子流程节点
如下为启动单一子流程实例,如果需要启动多实例的子流程可以查看另一篇文章【camunda 流程引擎如何开始并行任务,且有哪些实现方式?https://mp.csdn.net/mp_blog/creation/editor/122811046】
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_0232ymv" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="4.11.1" modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.15.0">
<bpmn:process id="Process_1218g4f" isExecutable="true">
<bpmn:startEvent id="StartEvent_1">
<bpmn:outgoing>Flow_0bbcod5</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:userTask id="Activity_1iscowy" name="审核">
<bpmn:incoming>Flow_0bbcod5</bpmn:incoming>
<bpmn:outgoing>Flow_0ik5gtc</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_0bbcod5" sourceRef="StartEvent_1" targetRef="Activity_1iscowy" />
<bpmn:sequenceFlow id="Flow_0ik5gtc" sourceRef="Activity_1iscowy" targetRef="Activity_1gh9p4v" />
<bpmn:userTask id="Activity_118v4cd" name="任务">
<bpmn:incoming>Flow_1oj78hn</bpmn:incoming>
<bpmn:outgoing>Flow_0w00h6g</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_1oj78hn" sourceRef="Activity_1gh9p4v" targetRef="Activity_118v4cd" />
<bpmn:endEvent id="Event_03r6tzn">
<bpmn:incoming>Flow_0w00h6g</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="Flow_0w00h6g" sourceRef="Activity_118v4cd" targetRef="Event_03r6tzn" />
<bpmn:subProcess id="Activity_1gh9p4v" name="子流程">
<bpmn:incoming>Flow_0ik5gtc</bpmn:incoming>
<bpmn:outgoing>Flow_1oj78hn</bpmn:outgoing>
<bpmn:sequenceFlow id="Flow_0pc1wpt" sourceRef="Activity_14u1not" targetRef="Event_0lililc" />
<bpmn:sequenceFlow id="Flow_086bxmh" sourceRef="Activity_0w6ec1g" targetRef="Activity_14u1not" />
<bpmn:sequenceFlow id="Flow_18m55sz" sourceRef="Event_0nu73jn" targetRef="Activity_0w6ec1g" />
<bpmn:endEvent id="Event_0lililc">
<bpmn:incoming>Flow_0pc1wpt</bpmn:incoming>
</bpmn:endEvent>
<bpmn:userTask id="Activity_14u1not" name="任务二">
<bpmn:incoming>Flow_086bxmh</bpmn:incoming>
<bpmn:outgoing>Flow_0pc1wpt</bpmn:outgoing>
</bpmn:userTask>
<bpmn:userTask id="Activity_0w6ec1g" name="任务一">
<bpmn:incoming>Flow_18m55sz</bpmn:incoming>
<bpmn:outgoing>Flow_086bxmh</bpmn:outgoing>
</bpmn:userTask>
<bpmn:startEvent id="Event_0nu73jn">
<bpmn:outgoing>Flow_18m55sz</bpmn:outgoing>
</bpmn:startEvent>
</bpmn:subProcess>
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1218g4f">
<bpmndi:BPMNEdge id="Flow_0bbcod5_di" bpmnElement="Flow_0bbcod5">
<di:waypoint x="215" y="310" />
<di:waypoint x="320" y="310" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0ik5gtc_di" bpmnElement="Flow_0ik5gtc">
<di:waypoint x="420" y="310" />
<di:waypoint x="520" y="310" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1oj78hn_di" bpmnElement="Flow_1oj78hn">
<di:waypoint x="660" y="310" />
<di:waypoint x="770" y="310" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0w00h6g_di" bpmnElement="Flow_0w00h6g">
<di:waypoint x="870" y="310" />
<di:waypoint x="992" y="310" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds x="179" y="292" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0gxffzb_di" bpmnElement="Activity_1iscowy">
<dc:Bounds x="320" y="270" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0wvu2b4_di" bpmnElement="Activity_118v4cd">
<dc:Bounds x="770" y="270" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_03r6tzn_di" bpmnElement="Event_03r6tzn">
<dc:Bounds x="992" y="292" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1gh9p4v_di" bpmnElement="Activity_1gh9p4v" isExpanded="true">
<dc:Bounds x="520" y="100" width="140" height="430" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Flow_18m55sz_di" bpmnElement="Flow_18m55sz">
<di:waypoint x="590" y="156" />
<di:waypoint x="590" y="180" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_086bxmh_di" bpmnElement="Flow_086bxmh">
<di:waypoint x="590" y="260" />
<di:waypoint x="590" y="320" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0pc1wpt_di" bpmnElement="Flow_0pc1wpt">
<di:waypoint x="590" y="400" />
<di:waypoint x="590" y="462" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="Event_0nu73jn_di" bpmnElement="Event_0nu73jn">
<dc:Bounds x="572" y="120" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0e2falq_di" bpmnElement="Activity_0w6ec1g">
<dc:Bounds x="540" y="180" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_17f2wn2_di" bpmnElement="Activity_14u1not">
<dc:Bounds x="540" y="320" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_0lililc_di" bpmnElement="Event_0lililc">
<dc:Bounds x="572" y="462" width="36" height="36" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
二:用’占位符’代替子流程
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_0232ymv" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="4.11.1" modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.15.0">
<bpmn:process id="Process_1218g4f" isExecutable="true">
<bpmn:startEvent id="StartEvent_1">
<bpmn:outgoing>Flow_0bbcod5</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:userTask id="Activity_1iscowy" name="审核">
<bpmn:incoming>Flow_0bbcod5</bpmn:incoming>
<bpmn:outgoing>Flow_0ik5gtc</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_0bbcod5" sourceRef="StartEvent_1" targetRef="Activity_1iscowy" />
<bpmn:sequenceFlow id="Flow_0ik5gtc" sourceRef="Activity_1iscowy" targetRef="Activity_0ay8prn" />
<bpmn:userTask id="Activity_118v4cd" name="任务">
<bpmn:incoming>Flow_1mkp82y</bpmn:incoming>
<bpmn:outgoing>Flow_0w00h6g</bpmn:outgoing>
</bpmn:userTask>
<bpmn:endEvent id="Event_03r6tzn">
<bpmn:incoming>Flow_0w00h6g</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="Flow_0w00h6g" sourceRef="Activity_118v4cd" targetRef="Event_03r6tzn" />
<bpmn:sequenceFlow id="Flow_1mkp82y" sourceRef="Activity_0ay8prn" targetRef="Activity_118v4cd" />
<bpmn:serviceTask id="Activity_0ay8prn" name="启动子流程">
<bpmn:incoming>Flow_0ik5gtc</bpmn:incoming>
<bpmn:outgoing>Flow_1mkp82y</bpmn:outgoing>
</bpmn:serviceTask>
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1218g4f">
<bpmndi:BPMNEdge id="Flow_0bbcod5_di" bpmnElement="Flow_0bbcod5">
<di:waypoint x="215" y="120" />
<di:waypoint x="320" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0ik5gtc_di" bpmnElement="Flow_0ik5gtc">
<di:waypoint x="420" y="120" />
<di:waypoint x="560" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0w00h6g_di" bpmnElement="Flow_0w00h6g">
<di:waypoint x="870" y="120" />
<di:waypoint x="992" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1mkp82y_di" bpmnElement="Flow_1mkp82y">
<di:waypoint x="660" y="120" />
<di:waypoint x="770" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
<dc:Bounds x="179" y="102" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0gxffzb_di" bpmnElement="Activity_1iscowy">
<dc:Bounds x="320" y="80" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0wvu2b4_di" bpmnElement="Activity_118v4cd">
<dc:Bounds x="770" y="80" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_03r6tzn_di" bpmnElement="Event_03r6tzn">
<dc:Bounds x="992" y="102" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1ct9tu3_di" bpmnElement="Activity_0ay8prn">
<dc:Bounds x="560" y="80" width="100" height="80" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
如果用占位符(Service Task)的方式去启动子流程,在设置事件启动点的时候,又有2种方式:
1、空白事件启动方式
2、选择消息、定时器、信息、条件启动事件方式(下面实例为信号和消息事件方式启动子流程)
信号事件类型启动子流程
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_0js57kf" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="4.11.1" modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.15.0">
<bpmn:process id="Process_0qplt59" isExecutable="true">
<bpmn:userTask id="Activity_1jhxkz3" name="任务一">
<bpmn:incoming>Flow_0ays4bz</bpmn:incoming>
<bpmn:outgoing>Flow_0vld40o</bpmn:outgoing>
</bpmn:userTask>
<bpmn:userTask id="Activity_1d0nrlf" name="任务二">
<bpmn:incoming>Flow_0vld40o</bpmn:incoming>
<bpmn:outgoing>Flow_0z13zvf</bpmn:outgoing>
</bpmn:userTask>
<bpmn:endEvent id="Event_1kb0wd1">
<bpmn:incoming>Flow_0z13zvf</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="Flow_0vld40o" sourceRef="Activity_1jhxkz3" targetRef="Activity_1d0nrlf" />
<bpmn:sequenceFlow id="Flow_0z13zvf" sourceRef="Activity_1d0nrlf" targetRef="Event_1kb0wd1" />
<bpmn:sequenceFlow id="Flow_0ays4bz" sourceRef="Event_0fltzrj" targetRef="Activity_1jhxkz3" />
<bpmn:startEvent id="Event_0fltzrj" name="信号子流程">
<bpmn:outgoing>Flow_0ays4bz</bpmn:outgoing>
<bpmn:signalEventDefinition id="SignalEventDefinition_000pg4x" signalRef="Signal_1i2qeo0" />
</bpmn:startEvent>
</bpmn:process>
<bpmn:signal id="Signal_1i2qeo0" name="signal" />
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_0qplt59">
<bpmndi:BPMNEdge id="Flow_0ays4bz_di" bpmnElement="Flow_0ays4bz">
<di:waypoint x="210" y="148" />
<di:waypoint x="210" y="192" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0vld40o_di" bpmnElement="Flow_0vld40o">
<di:waypoint x="210" y="272" />
<di:waypoint x="210" y="332" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0z13zvf_di" bpmnElement="Flow_0z13zvf">
<di:waypoint x="210" y="412" />
<di:waypoint x="210" y="474" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="Activity_1jhxkz3_di" bpmnElement="Activity_1jhxkz3">
<dc:Bounds x="160" y="192" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1d0nrlf_di" bpmnElement="Activity_1d0nrlf">
<dc:Bounds x="160" y="332" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_1kb0wd1_di" bpmnElement="Event_1kb0wd1">
<dc:Bounds x="192" y="474" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_13zdp51_di" bpmnElement="Event_0fltzrj">
<dc:Bounds x="192" y="112" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="186" y="82" width="55" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
消息事件类型启动子流程
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_1uxobnf" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="4.11.1" modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.15.0">
<bpmn:process id="Process_1vseutv" name="消息事件方式发起流程" isExecutable="true">
<bpmn:userTask id="Activity_0amzx6i" name="经理审批" camunda:assignee="demo">
<bpmn:incoming>Flow_055trdz</bpmn:incoming>
<bpmn:incoming>Flow_1ku1i7k</bpmn:incoming>
<bpmn:outgoing>Flow_16yqwjt</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_055trdz" sourceRef="StartEvent_1" targetRef="Activity_0amzx6i" />
<bpmn:userTask id="Activity_0ipk02z" name="财务审批" camunda:assignee="demo">
<bpmn:incoming>Flow_16yqwjt</bpmn:incoming>
<bpmn:outgoing>Flow_0lwwz4n</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sequenceFlow id="Flow_16yqwjt" sourceRef="Activity_0amzx6i" targetRef="Activity_0ipk02z" />
<bpmn:sequenceFlow id="Flow_1ku1i7k" sourceRef="Event_1hgjwbp" targetRef="Activity_0amzx6i" />
<bpmn:boundaryEvent id="Event_1hgjwbp" attachedToRef="Activity_0ipk02z">
<bpmn:outgoing>Flow_1ku1i7k</bpmn:outgoing>
<bpmn:conditionalEventDefinition id="ConditionalEventDefinition_04uw4hm">
<bpmn:condition xsi:type="bpmn:tFormalExpression">${money>10000}</bpmn:condition>
</bpmn:conditionalEventDefinition>
</bpmn:boundaryEvent>
<bpmn:endEvent id="Event_03yf0hk">
<bpmn:incoming>Flow_0lwwz4n</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="Flow_0lwwz4n" sourceRef="Activity_0ipk02z" targetRef="Event_03yf0hk" />
<bpmn:startEvent id="StartEvent_1">
<bpmn:outgoing>Flow_055trdz</bpmn:outgoing>
<bpmn:messageEventDefinition id="MessageEventDefinition_0o0ivuo" messageRef="Message_1i854ob" />
</bpmn:startEvent>
</bpmn:process>
<bpmn:message id="Message_1i854ob" name="telMessage" />
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1vseutv">
<bpmndi:BPMNEdge id="Flow_0lwwz4n_di" bpmnElement="Flow_0lwwz4n">
<di:waypoint x="630" y="117" />
<di:waypoint x="702" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1ku1i7k_di" bpmnElement="Flow_1ku1i7k">
<di:waypoint x="580" y="175" />
<di:waypoint x="580" y="195" />
<di:waypoint x="350" y="195" />
<di:waypoint x="350" y="157" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_16yqwjt_di" bpmnElement="Flow_16yqwjt">
<di:waypoint x="400" y="117" />
<di:waypoint x="530" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_055trdz_di" bpmnElement="Flow_055trdz">
<di:waypoint x="215" y="117" />
<di:waypoint x="300" y="117" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape id="Activity_0amzx6i_di" bpmnElement="Activity_0amzx6i">
<dc:Bounds x="300" y="77" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_0ipk02z_di" bpmnElement="Activity_0ipk02z">
<dc:Bounds x="530" y="77" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_03yf0hk_di" bpmnElement="Event_03yf0hk">
<dc:Bounds x="702" y="99" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_0kfrdnl_di" bpmnElement="StartEvent_1">
<dc:Bounds x="179" y="99" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_1v2s3sf_di" bpmnElement="Event_1hgjwbp">
<dc:Bounds x="562" y="139" width="36" height="36" />
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
Service Task 是以实现 JavaDelegate 接口代码:
package com.bpm.config;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.JavaDelegate;
/**
* 消息启动子流程
* 信号启动子流程
*/
public class InstantiateProcessByMessageDelegate implements JavaDelegate {
@Override
public void execute(DelegateExecution execution) throws Exception {
String type = (String)execution.getVariable("type");
RuntimeService runtimeService = execution.getProcessEngineServices().getRuntimeService();
switch (type){
case "tel”:
// 消息方式启动子流程
runtimeService.startProcessInstanceByMessage("telMessage");
break ;
case "sign":
// 信号方式启动子流程
runtimeService.createSignalEvent("signal").send();
break;
default:
// 消息方式启动子流程
runtimeService.startProcessInstanceByMessage("pcMessage");
}
}
}