BPMN2.0规范简述

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>