BPMN2.0规范
- 简介
- 主要图元
- 启动事件
- 结束事件
- 顺序流
- 任务
- 网关
- 流程图例
简介
BPMN的全称为Business Process Model And Notation,中文为业务流程模型与符号,由标准组织BPMN发布,BPMN 1.0规范在2004年5月发布,最新的BPMN2.0规范于2011年12月发布。目前该规范已被各大厂商、开源社区所接受,基于该规范设计流程引擎或兼容该规范,使得流程建模有了统一的标准。
可以从https://www.omg.org/spec/BPMN/2.0/获取官方发布的规范文档。
BPMN2.0规范的重点在于定义执行语义和通用的建模交换格式,这样流程建模数据可以在基于BPMN2.0规范的设计器和引擎上设计与执行。
下面主要讲解BPMN2.0中主要图元的含义与用法。
主要图元
启动事件
用于表示一个流程的开始,启动事件是一个大类,BPMN2.0规范中共定义了7种类型,如下主要说明常用的3种类型。
- 空启动事件
空启动事件是流程建模中最常用的启动事件,在XML中的代码如下:
1 | <startEvent id="StartEvent_0to3od1" name="开始"/> |
- 定时启动事件
定时启动事件可以一次性定时启动或者特定时间间隔后启动,在XML中代码如下:
1 2 3 4 5 | <startEvent id="Event_0g6d39e"> <timerEventDefinition> <timeCycle></timeCycle> </timerEventDefinition> </startEvent> |
其中timerEventDefinition支持如下节点设置定时规则
- 消息启动事件
消息启动事件通过一个消息名称触发,在XML中代码如下:
1 2 3 | <startEvent id="Event_0ry7h7s"> <messageEventDefinition id="MessageEventDefinition_1beh49z" /> </startEvent> |
结束事件
用于表示一个流程的结束,BPMN2.0规范中共定义了9种类型,如下主要说明常用的3种类型。
- 空结束事件
空结束事件表示流程正常结束,没有其他后续处理,在XML中的代码如下:
1 | <endEvent id="Event_16b145j" name="结束"/> |
- 异常结束事件
在流程执行过程中抛出了特定的错误代码,如果存在对应的异常开始事件,则触发异常开始事件,否则按照空结束时间处理,在XML中的代码如下:
1 2 3 | <endEvent id="Event_1xytvvd"> <errorEventDefinition errorRef="ERRORCODE_001" /> </endEvent> |
- 终止结束事件
终止结束事件可以终止一个流程实例,当流程流传到该结束事件时,表示要终止流程实例(具体由流程引擎实现),在XML中的代码如下:
1 2 3 | <endEvent id="Event_09oopgk"> <terminateEventDefinition/> </endEvent> |
顺序流
顺序流连接2个流程图元,流程运行时会沿着顺序流运行,直至流程结束。顺序流分为如下2种类型。
- 标准顺序流
用来连接两个或多个流程图元,在XML中的代码如下:
其中sourceRef 属性指定顺序流的源图元id, 使用 targetRef 指定顺序流的目标图元id
1 | <sequenceFlow id="Flow_0jde5wk" sourceRef="Gateway_0a25gry" targetRef="Activity_00wv1j0" /> |
- 条件顺序流
条件顺序流可以添加条件表达式或规则(各流程引擎都会实现各自的规则运算),当条件满足时,则流程流传到顺序流的目标图元。当源图元是单一网关时,会使用默认的条件顺序流,即网关的其他分支条件不通过时,则走默认分支。
顺序流在XML中的代码如下:
1 2 3 4 5 | <sequenceFlow id="Flow_1llw3na" sourceRef="Gateway_0riripr" targetRef="Activity_1hu5eqt" > <conditionExpression> {条件表达式或规则内容} </conditionExpression> </sequenceFlow> |
任务
任务在BPMN2.0中是非常重要的部分。任务根据业务要求分为多种类型,下面主要说明常用的2中任务。
- 人工任务
人工任务是需要有人来参与的任务,如审批任务,人工任务需定义任务的参与者,可以为用户组或个人,如果为会签任务,可以是多个人参与。在XML中的代码如下:
除了BPMN2.0规范定义的节点属性,各流程引擎在实现规范时会自定义扩展属性存放参与者信息,如该任务的处理人。
1 2 3 4 | <userTask id="Activity_1maa7u0" name="填单"> <incoming>Flow_02f275b</incoming> <outgoing>Flow_1llw3na</outgoing> </userTask> |
- 服务任务
服务任务是使用某种服务的任务,该服务可以是Web服务或自动化应用,不需要参与者人单独处理。当顺序流执行到该活动时,服务任务绑定的服务会被执行,执行完后,顺序流会继续往后流转,直到下一个人工任务或结束。
在XML中的代码如下:
各流程引擎会通过自定义扩展属性存放待执行的服务名称或地址。
1 2 3 4 | <serviceTask id="Activity_0c9bog4" name="服务"> <incoming>Flow_0ca61er</incoming> <outgoing>Flow_07ndt5l</outgoing> </serviceTask> |
网关
网关用于控制顺序流在流程中收敛和发散时的交互方式,BPMN2.0规范中共有6种类型的网关,这里主要说明如下3种。
此外某些流程引擎会实现一种自选网关,由用户来选择要流转的顺序流。
- 单一网关
单一网关会逐个计算输出顺序流的条件,当为true时,则流程会沿着该顺序流完后流转,其他分支条件即使为true也忽略。但当所有分支均为false,则流程引擎会抛出异常。不过如果指定了默认分支,其他分支为false的情况下,则会流转到默认分支的顺序流,通过default属性指定。
在XML中的代码如下:
1 2 3 4 5 | <exclusiveGateway id="Gateway_11lk0du" default="Flow_06eq303"> <incoming>Flow_09w8aw9</incoming> <outgoing>Flow_06eq303</outgoing> <outgoing>Flow_0ca61er</outgoing> </exclusiveGateway> |
- 多路网关
多路网关与单一网关类似,会逐个计算输出顺序流的条件,所有为true的顺序流都会流转,即流程运行会存在并行。多路网关也存在默认分支,其他分支为false的情况下,则会流转到默认分支的顺序,通过default属性指定。
在XML中的代码如下:
1 2 3 4 5 | <inclusiveGateway id="Gateway_11lk0du" default="Flow_06eq303"> <incoming>Flow_09w8aw9</incoming> <outgoing>Flow_06eq303</outgoing> <outgoing>Flow_0ca61er</outgoing> </inclusiveGateway> |
- 并行网关
并行网关用于并发的任务流转,顺序流上没有条件设置,每个顺序流都会执行。
在XML中的代码如下:
1 2 3 4 5 | <parallelGateway id="Gateway_11lk0du"> <incoming>Flow_09w8aw9</incoming> <outgoing>Flow_06eq303</outgoing> <outgoing>Flow_0ca61er</outgoing> </parallelGateway> |
流程图例
以下流程图在https://demo.bpmn.io/new中在线绘制。
符合BPMN2.0规范的完整流程图XML如下:
其中definitions为根节点,其下级可以存在多个process流程图节点;
process下则为流程图元的定义。
bpmndi:BPMNDiagram为流程图的形状大小及位置信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | <?xml version="1.0" encoding="UTF-8"?> <bpmn:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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" id="Definitions_0hpv0ew" targetNamespace="http://bpmn.io/schema/bpmn" exporter="bpmn-js (https://demo.bpmn.io)" exporterVersion="7.2.0"> <bpmn:process id="Process_16el6z5" isExecutable="false"> <bpmn:startEvent id="StartEvent_1th90s4" name="开始"> <bpmn:outgoing>Flow_0ju27zd</bpmn:outgoing> </bpmn:startEvent> <bpmn:userTask id="Activity_0hguomk" name="填单"> <bpmn:incoming>Flow_0ju27zd</bpmn:incoming> <bpmn:outgoing>Flow_09w8aw9</bpmn:outgoing> </bpmn:userTask> <bpmn:sequenceFlow id="Flow_0ju27zd" sourceRef="StartEvent_1th90s4" targetRef="Activity_0hguomk" /> <bpmn:endEvent id="Event_1wjfaqe" name="结束"> <bpmn:incoming>Flow_0yj5y67</bpmn:incoming> </bpmn:endEvent> <bpmn:sequenceFlow id="Flow_09w8aw9" sourceRef="Activity_0hguomk" targetRef="Gateway_11lk0du" /> <bpmn:sequenceFlow id="Flow_06eq303" sourceRef="Gateway_11lk0du" targetRef="Activity_0r5hia4" /> <bpmn:sequenceFlow id="Flow_0ca61er" name="条件" sourceRef="Gateway_11lk0du" targetRef="Activity_0c9bog4" /> <bpmn:sequenceFlow id="Flow_07ndt5l" sourceRef="Activity_0c9bog4" targetRef="Gateway_0chxiat" /> <bpmn:sequenceFlow id="Flow_0ccywy4" sourceRef="Activity_0r5hia4" targetRef="Gateway_0chxiat" /> <bpmn:sequenceFlow id="Flow_0yj5y67" sourceRef="Gateway_0chxiat" targetRef="Event_1wjfaqe" /> <bpmn:userTask id="Activity_0r5hia4" name="审核"> <bpmn:incoming>Flow_06eq303</bpmn:incoming> <bpmn:outgoing>Flow_0ccywy4</bpmn:outgoing> </bpmn:userTask> <bpmn:serviceTask id="Activity_0c9bog4" name="服务"> <bpmn:incoming>Flow_0ca61er</bpmn:incoming> <bpmn:outgoing>Flow_07ndt5l</bpmn:outgoing> </bpmn:serviceTask> <bpmn:exclusiveGateway id="Gateway_11lk0du" default="Flow_06eq303"> <bpmn:incoming>Flow_09w8aw9</bpmn:incoming> <bpmn:outgoing>Flow_06eq303</bpmn:outgoing> <bpmn:outgoing>Flow_0ca61er</bpmn:outgoing> </bpmn:exclusiveGateway> <bpmn:exclusiveGateway id="Gateway_0chxiat"> <bpmn:incoming>Flow_07ndt5l</bpmn:incoming> <bpmn:incoming>Flow_0ccywy4</bpmn:incoming> <bpmn:outgoing>Flow_0yj5y67</bpmn:outgoing> </bpmn:exclusiveGateway> </bpmn:process> <bpmndi:BPMNDiagram id="BPMNDiagram_1"> <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_16el6z5"> <bpmndi:BPMNEdge id="Flow_0ju27zd_di" bpmnElement="Flow_0ju27zd"> <di:waypoint x="192" y="219" /> <di:waypoint x="280" y="219" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="Flow_09w8aw9_di" bpmnElement="Flow_09w8aw9"> <di:waypoint x="380" y="219" /> <di:waypoint x="435" y="219" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="Flow_06eq303_di" bpmnElement="Flow_06eq303"> <di:waypoint x="460" y="194" /> <di:waypoint x="460" y="120" /> <di:waypoint x="580" y="120" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="Flow_0ca61er_di" bpmnElement="Flow_0ca61er"> <di:waypoint x="460" y="244" /> <di:waypoint x="460" y="320" /> <di:waypoint x="580" y="320" /> <bpmndi:BPMNLabel> <dc:Bounds x="464" y="279" width="22" height="14" /> </bpmndi:BPMNLabel> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="Flow_07ndt5l_di" bpmnElement="Flow_07ndt5l"> <di:waypoint x="680" y="320" /> <di:waypoint x="790" y="320" /> <di:waypoint x="790" y="244" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="Flow_0ccywy4_di" bpmnElement="Flow_0ccywy4"> <di:waypoint x="680" y="120" /> <di:waypoint x="790" y="120" /> <di:waypoint x="790" y="194" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="Flow_0yj5y67_di" bpmnElement="Flow_0yj5y67"> <di:waypoint x="815" y="219" /> <di:waypoint x="922" y="219" /> </bpmndi:BPMNEdge> <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1th90s4"> <dc:Bounds x="156" y="201" width="36" height="36" /> <bpmndi:BPMNLabel> <dc:Bounds x="163" y="244" width="22" height="14" /> </bpmndi:BPMNLabel> </bpmndi:BPMNShape> <bpmndi:BPMNShape id="Activity_13t3ktw_di" bpmnElement="Activity_0hguomk"> <dc:Bounds x="280" y="179" width="100" height="80" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape id="Event_1wjfaqe_di" bpmnElement="Event_1wjfaqe"> <dc:Bounds x="922" y="201" width="36" height="36" /> <bpmndi:BPMNLabel> <dc:Bounds x="929" y="244" width="22" height="14" /> </bpmndi:BPMNLabel> </bpmndi:BPMNShape> <bpmndi:BPMNShape id="Activity_1hee9yq_di" bpmnElement="Activity_0r5hia4"> <dc:Bounds x="580" y="80" width="100" height="80" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape id="Activity_0inkrx9_di" bpmnElement="Activity_0c9bog4"> <dc:Bounds x="580" y="280" width="100" height="80" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape id="Gateway_0np8j7w_di" bpmnElement="Gateway_11lk0du" isMarkerVisible="true"> <dc:Bounds x="435" y="194" width="50" height="50" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape id="Gateway_1t8b9vq_di" bpmnElement="Gateway_0chxiat" isMarkerVisible="true"> <dc:Bounds x="765" y="194" width="50" height="50" /> </bpmndi:BPMNShape> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </bpmn:definitions> |