BPMN2.0规范部分总结
基本概念:
对业务流程管理(Business process management)进行建模称为业务流程建模(Business Process Model),业务流程建模语言BPMN(Business Process Model Notation)是其一种建模语言,而BPMN2.0规范(Business Process Model and Notation 2.0)是基于BPMN的一套标准,对BPMN进行了重新的定义。
BPMN的价值:
BPMN的开发旨在减少众多已存在的业务建模工具和流程记录工具之间的断层。
BPMN2-Conformance 一致性:
- Process Modeling Conformance 流程模型一致性
- Process Execution conformance 流程执行一致性
- BPEL Process Execution Conformance BPEL 流程执行一致性
- Choreography Modeling Conformance 编排模型一致性
BPMN2-Element 元素:
- Flow Objects 流对象(三个核心元素)
1) Events 事件(用于对流程生命周期中发生的事件进行建模。)
Event 用一个圆圈表示,它是流程中运行过程中发生的事情。事件的发生会影响到流程的流转.事件包含Start\Intermediate\End三种类型。
2) Activities 活动(任务表示流程中具体要做的事情,通常一个任务表示工作需要被外部实体完成,比如人工任务和自动服务。)
活动用圆角矩形表示,一个活动多个活动组成,活动的类型分为Task和Sub-Process。
3) Gateways 网关(用来控制流程的流向)
网关用菱形表示,用于控制流程的分支和聚合。
现实业务所有的业务环节都离不开Activities、Gateways和Events,无论是简单的条件审批还是复杂的父子流程循环处理,在一个流程定义描述中,所有的业务环节都离不开Task、Sequence Flow、Exclusive Gateway、Inclusive Gateway(如图1中右侧绿色标记所示元素),其中Task是一个极具威力的元素,它能描述业务过程中所有能发生工时的行为,它包括User Task、Manual Task、Service Task、Script Task等,可以被用来描述人机交互任务、线下操作任务、服务调用、脚本计算任务等常规功能。
User Task:生成人机交互任务,主要被用来描述需要人为在软件系统中进行诸如任务明细查阅、填写审批意见等业务行为的操作,流程引擎流转到此类节点时,系统会自动生成被动触发任务,须人工响应后才能继续向下流转。常用于审批任务的定义。
Manual Task:线下人为操作任务,常用于为了满足流程图对实际业务定义的完整性而进行的与流程驱动无关的线下任务,即此类任务不参与实际工作流流转。常用于诸如物流系统中的装货、运输等任务的描述。
Service Task:服务任务,通常工作流流转过程中会涉及到与自身系统服务API调用或与外部服务相互调用的情况,此类任务往往由一个具有特定业务服务功能的Java类承担,与User Task不同,流程引擎流经此节点会自动调用Java类中定义的方法,方法执行完毕自动向下一流程节点流转。另外,此类任务还可充当“条件路由”的功能对流程流转可选分支进行自动判断。常用于业务逻辑API的调用。
Script Task:脚本任务,在流程流转期间以“脚本”的声明或语法参与流程变量的计算,目前支持的脚本类型有三种:juel(即JSP EL)、groovy和javascript。在Activiti5.9中新增了Shell Task,可以处理系统外部定义的Shell脚本文件,也与Script Task有类似的功能。常用于流程变量的处理。
2. Data 数据
1) Data Objects 数据对象
2) Data Inputs 数据输入
3) Data OutPuts 数据输出
4) Data Stores 数据存储
3. Connecting Objects 连接对象
1) Sequence Flows 序列流
Sequence Flows 用实线实心箭头表示,代表流程中将被执行的活动的执行顺序。
2) Message Flows 消息流
Message Flows 用虚线空心箭头表示,第阿宝2个分开的流程参与者直接发送或者接收到的消息流.
3) Associations 结合关系
Associations 用点状虚线表示,用于显示活动的输入输出.
4) Data Associations 数据结合关系
4. Swimlanes 泳道
1) Pools 池
池描述流程中的一个参与者。可以看做是将一系列活动区别于其他池的一个图形容器,一般用于B2B的上下文中
2) Lanes 道
道就是在池里面再细分,可以是垂直的也可以是水平的。道也是用于组织和分类活动。
5. Artifacts 工件
1) Group 组
2) Text Annotation 文本注释
BPMN2-Diagram Types 图类型:
- Private Processes 私有流程
- Public Processes 共有流程
- Choreographies Processes 组合流程
什么是工作流引擎:
工作流引擎是一个用于管理和调度流程的应用程序,可以集成并作为程序框架使用,包括流程定义的存储,流程的节点与流程条件判断和调度、流向管理、流程实例管理等功能。
工作流引擎与BPMN有什么关系:
通过BPMN(业务流程建模语言)来进行BPM(业务流程建模)得到的结果就是业务流程的定义,它规定了业务的流转过程由谁参与等等。而协调并执行这个流程,记录流程的执行过程和结果就是工作流引擎的职责范围了。
工作流引擎:
Activiti:
BPMN2.0的基本元素:
- 顺序流(sequence flow)
顺序流是流程中两个元素间的连接器。顺序流就是事件,活动和网关之间的连线,显示为一条实线带有箭头,在BPMN图形中每个顺序流都有一个源头和一个目标引用,包含了活动,事件或网关的id。在流程执行过程中,一个元素被访问后,会沿着其所有出口顺序流继续执行。这意味着BPMN 2.0的默认是并行执行的:两个出口顺序流就会创建两个独立的、并行的执行路径。
<sequenceFlow id="myFlow" name="MyFlow" sourceRef="sourceId" targetRef="targetId" /> |
用从源元素指向目标元素的箭头表示。箭头总是指向目标元素。
1) 条件顺序流
在顺序流上可以定义条件(conditional sequence flow),默认行为是计算其每个出口顺序流上的条件。当条件计算为true时,选择该出口顺序流。条件顺序流的XML表示格式为含有conditionExpression(条件表达式)子元素的普通顺序流。
<sequenceFlow id="flow" sourceRef="theStart" argetRef="theTask"> <conditionExpression xsi:type="tFormalExpression"> <![CDATA[${order.price > 100 && order.price < 250}]]> </conditionExpression> </sequenceFlow> |
2) 默认顺序流
所有BPMN 2.0任务和网关都可以具有默认序列流。当且仅当其他条件顺序流都为false时,才选择执行默认顺序流。默认序列流的条件总是被忽略。
<exclusiveGateway id="exclusiveGw" name="Exclusive Gateway" default="flow2" /> <sequenceFlow id="flow1" sourceRef="exclusiveGw" targetRef="task1"> <conditionExpression xsi:type="tFormalExpression"> ${conditionA} </conditionExpression> </sequenceFlow> <sequenceFlow id="flow2" sourceRef="exclusiveGw" targetRef="task2"/> <sequenceFlow id="flow3" sourceRef="exclusiveGw" targetRef="task3"> <conditionExpression xsi:type="tFormalExpression"> ${conditionB} </conditionExpression> </sequenceFlow> </exclusiveGateway> |
- 活动(任务)
1) 用户任务
用户任务(user task)用于对需要人工执行的任务进行建模。当流程执行到达用户任务时,会为指派至该任务的用户或组的任务列表创建一个新任务。
用户任务用左上角有一个小用户图标的标准任务(圆角矩形)表示。
id是必须的,name是可选的,通过documentation元素对任务进行描述。任何bpmn2.0元素都可用documentation元素进行描述。
<userTask id="theTask" name="Schedule meeting" > <documentation> Schedule an engineering meeting for next week with the new hire. </documentation> </userTask> |
到期日:可通过dueDate字段设置任务的到期时间。
用户分配
人工任务可分配给三种人:assignee(办理人、受让人),candidate(候选人),candidateGroup(候选人组)。assignee是任务的实际办理人,任务只能同时有一个办理人。任务可以有多个候选人,每个候选人都能看到该任务,候选人需要claim(拾取)任务成为assignee后,才能进行任务的办理,任务被拾取后其他候选人就看不到该任务了。候选人在拾取任务后可以unclaim,将任务归还,此时其他候选人可以看到并claim任务。不想单独指定多个候选人,可以指定一个候选人组,一般为角色ID。
分配方式有三种:1)画图时写死。2)通过UEL表达式动态设置。3)通过TaskListener监听器指定。
<userTask id="task1" name="My task" > <extensionElements> <flowable:taskListener event="create" class="org.flowable.MyAssignmentHandler" /> </extensionElements> </userTask> |
2) 服务任务
服务任务(service task)用于调用Java类。流程执行到服务任务时,会自动运行Java程序中的代码流程。
服务任务用左上角有一个小齿轮图标的圆角矩形表示。
<serviceTask id="javaService" name="My Java Service Task" flowable:class="com.inossem.MyJavaDelegate" /> |
或使用表达式,结合spring的IOC机制,如下使用。
<serviceTask id="serviceTask" flowable:delegateExpression="${springBeanName}" /> |
3) 脚本任务
用于执行脚本文件(如javascript)。
<scriptTask id="theScriptTask" name="Execute script" scriptFormat="groovy"> <script> sum = 0 for ( i in inputArray ) { sum += i } </script> </scriptTask> |
- 网关(节点)
1) 排他网关
排他网关(exclusive gateway)(也叫异或网关 XOR gateway,或者更专业的,基于数据的排他网关 exclusive data-based gateway),用于对流程中的决策建模。当执行到达这个网关时,会按照所有出口顺序流定义的顺序对它们进行计算。选择第一个条件计算为true的顺序流(当没有设置条件时,认为顺序流为true)继续流程。
排他网关用内部带有‘X’图标的标准网关(菱形)表示,‘X’图标代表异或的含义。请注意内部没有图标的网关默认为排他网关。BPMN 2.0规范不允许在同一个流程中混合使用有及没有X的菱形标志。
<exclusiveGateway id="exclusiveGw" name="Exclusive Gateway" /> |
2) 并行网关
网关也可以建模流程中的并行执行。在流程模型中引入并行的最简单的网关,就是并行网关(parallel gateway)。它可以将执行分支(fork)为多条路径,也可以合并(join)多条入口路径的执行。
并行网关的功能取决于其入口与出口顺序流:
分支:所有的出口顺序流都并行执行,为每一条顺序流创建一个并行执行。
合并:所有到达并行网关的并行执行都会在网关处等待,直到每一条入口顺序流都到达了有个执行。然后流程经过该合并网关继续。
如果并行网关同时具有多条入口与出口顺序流,可以同时具有分支与合并的行为。在这种情况下,网关首先合并所有入口顺序流,然后分裂为多条并行执行路径。
与其他网关类型有一个重要区别:并行网关不计算条件。如果连接到并行网关的顺序流上定义了条件,会直接忽略该条件。
并行网关,用内部带有‘加号’图标的网关(菱形)表示,代表与(AND)的含义。
<parallelGateway id="myParallelGateway" /> |
3) 包含网关
看作是排他网关和并行网关的组合,包含网关既能进行条件判断,又能并行执行多个分支。
<inclusiveGateway id="myInclusiveGateway" /> |
4. 事件
1) 启动&结束事件
启动事件(start event)是流程的起点。启动事件的类型(流程在消息到达时启动,在指定的时间间隔后启动,等等),定义了流程如何启动,并显示为启动事件中的小图标。在XML中,类型由子元素声明来定义。
启动事件可以有多种类型,如:空启动事件、定时器启动事件、消息启动事件、信号启动事件、错误启动事件等。
<startEvent id="start" name="my start event" /> |
结束事件(end event)标志着流程或子流程中一个分支的结束。结束事件总是抛出型事件。这意味着当流程执行到达结束事件时,会抛出一个结果。结果的类型由事件内部的黑色图标表示。结束事件同样有多种类型。
<endEvent id="end" name="my end event" /> |
2) 边界事件
边界事件(boundary event)是捕获型事件,依附在活动(activity)上。边界事件永远不会抛出。这意味着当活动运行时,事件将监听特定类型的触发器。当捕获到事件时,会终止活动,并沿该事件的出口顺序流继续。
错误边界事件用内部有一个错误图标的标准中间事件(两层圆圈)表示。错误图标是白色的,代表捕获的含义。
3) 抛出&捕获事件
捕获中间事件用内部有对应事件图标的标准中间事件(两层圆圈)表示。图标是白色的(未填充),代表捕获的含义。
抛出中间事件用内部有对应事件图标的标准中间事件(两层圆圈)表示。图标是黑色的(已填充),代表抛出的含义。
5. 子流程与调用活动
1) 子流程
在BPM表中有子流程和引用活动的概念,如果一个流程在多个环节中使用,那么就可以考虑将该流程拆分为一个独立的子流程,这样其他的流程引入该流程就可以。子流程和引用活动的目的是简化繁琐重复流程的配置,也便于在流程图中对整个环节进行跟踪。
子流程有两个主要的使用场景:
子流程可以分层建模。很多建模工具都可以折叠子流程,隐藏子流程的所有细节,而只显示业务流程的高层端到端总览。
子流程会创建新的事件范围。在子流程执行中抛出的事件可以通过子流程边界上的边界事件捕获,为该事件创建了限制在子流程内的范围。
使用子流程也要注意以下几点:
子流程只能有一个空启动事件,而不允许有其他类型的启动事件。请注意BPMN 2.0规范允许省略子流程的启动与结束事件。
顺序流不能跨越子流程边界。
子流程表示为标准活动(圆角矩形)。若折叠了子流程,则只显示其名字与一个加号,以展示流程的高层概览。
若展开了子流程,则在子流程内显示子流程的所有步骤。
2) 调用活动
图示上看起来很相像子流程,但在BPMN 2.0中,调用活动(call activity)有别于一般的子流程(子流程通常也称作嵌入式子流程)。从概念上说,两者都在流程执行到达该活动时,调用一个子流程。
两者的区别为,调用活动引用一个流程定义外部的流程,而子流程嵌入在原有流程定义内。调用活动的主要使用场景是,在多个不同流程定义中调用一个可复用的流程定义。
当流程执行到达调用活动时,会创建一个新的执行,作为到达调用活动的执行的子执行。这个子执行用于执行子流程,也可用于创建并行子执行(与普通流程中行为类似)。父执行将等待子流程完成,之后沿原流程继续执行。
调用过程表现为带有粗边框(折叠与展开都是)的子流程。取决于建模工具,调用过程可以展开,但默认表现为折叠形式。
BPMN2.0流程示例:
BPMN2.0请假流程定义
请假流程所用图元