这里写目录标题
一、BPMN介绍
BPMN是一个被广泛接收和支持的,展现流程的语言。该文件一般以。bpmn20.xml或者.bpmn结尾。
1.1、BPMN根元素
BPMN 2.0概要(schema)的根元素(root element)是definitions元素。
xml
<definitions
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:flowable="http://flowable.org/bpmn"
targetNamespace="Examples">
<process id="myProcess" name="My First Process">
..
</process>
</definitions>
1.2、process元素
1.2.1、id:必填属性
将映射为Flowable ProcessDefinition对象的key参数。
1.2.2、name:可选属性
将映射为ProcessDefinition的name参数。引擎本身不会使用这个参数。可以用于在用户界面上显示更友好的名字。
二、事件
**事件(event)**通常用于为流程生命周期中发生的事情建模。事件总是图形化为圆圈。
2.1、启动事件
**启动事件(start event)**是流程的起点。启动事件的类型(流程在消息到达时启动,在指定的时间间隔后启动,等等),定义了流程如何启动,并显示为启动事件中的小图标。在XML中,类型由子元素声明来定义。
initiator
指明保存认证用户(authenticated user)ID用的变量名。在流程启动时,操作用户的ID会保存在这个变量中。例如
xml
<startEvent id="request" flowable:initiator="initiator" />
2.2、空启动事件
"空"启动事件(none Start Event),指的是未指定启动流程实例触发器的启动事件。引擎将无法预知何时启动流程实例。空启动事件用于流程实例通过调用下列startProcessInstanceByXXX API方法启动的情况。
java
ProcessInstance processInstance = runtimeService.startProcessInstanceByXXX();
请注意:子流程(sub-process)必须有空启动事件。
图示
空启动事件用空心圆圈表示,中间没有图标(也就是说,没有触发器)。

XML表示
空启动事件的XML表示格式,就是普通的启动事件声明,而没有任何子元素(其他种类的启动事件都有用于声明其类型的子元素)。
2.3、结束事件
结束事件(end event)标志着流程或子流程中一个分支的结束。
结束事件总是抛出(型)事件。这意味着当流程执行到达结束事件时,会抛出一个结果。结果的类型由事件内部的黑色图标表示。在XML表示中,类型由子元素声明给出。
2.4、空结束事件
"空"结束事件(none end event),意味着当到达这个事件时,没有特别指定抛出的结果。因此,引擎除了结束当前执行分支之外,不会多做任何事情。
图示
空结束事件,用其中没有图标(没有结果类型)的粗圆圈表示。

XML表示
空事件的XML表示格式为普通结束事件声明,没有任何子元素(其它种类的结束事件都有子元素,用于声明其类型)。
xml
<endEvent id="end" name="my end event" />
三、顺序流
3.1、顺序流
3.1.1、描述
**顺序流(sequence flow)**是流程中两个元素间的连接器。在流程执行过程中,一个元素被访问后,会沿着其所有出口顺序流继续执行。这意味着BPMN 2.0的默认是并行执行的:两个出口顺序流就会创建两个独立的、并行的执行路径。
3.1.2、图示
顺序流,用从源元素指向目标元素的箭头表示。箭头总是指向目标元素。

3.1.3、XML表示
顺序流需要有流程唯一的id,并引用存在的源与目标元素。
<sequenceFlow id="flow1" sourceRef="theStart" targetRef="theTask" />
3.2、条件顺序流
3.2.1、描述
在顺序流上可以定义条件(conditional sequence flow)。当离开BPMN 2.0活动时,默认行为是计算其每个出口顺序流上的条件。当条件计算为true时,选择该出口顺序流。如果该方法选择了多条顺序流,则会生成多个执行,流程会以并行方式继续。
请注意:上面的介绍针对BPMN 2.0活动(与事件),但不适用于网关(gateway)。不同类型的网关,会用不同的方式处理带有条件的顺序流。
3.2.2、图示
条件顺序流用起点带有小菱形的顺序流表示。在顺序流旁显示条件表达式。

3.2.3、XML表示
条件顺序流的XML表示格式为含有conditionExpression(条件表达式)子元素的普通顺序流。请注意目前只支持tFormalExpressions。可以省略xsi:type=""定义,默认为唯一支持的表达式类型。
xml
<sequenceFlow id="flow" sourceRef="theStart" targetRef="theTask">
<conditionExpression xsi:type="tFormalExpression">
<![CDATA[${order.price > 100 && order.price < 250}]]>
</conditionExpression>
</sequenceFlow>
目前conditionalExpressions只能使用UEL。使用的表达式需要能解析为boolean值,否则当计算条件时会抛出异常。
- 下面的例子,通过典型的JavaBean的方式,使用getter引用流程变量的数据。
xml
<sequenceFlow id="flow" sourceRef="theStart" targetRef="theTask">
<conditionExpression xsi:type="tFormalExpression">
<![CDATA[${order.price > 100 && order.price < 250}]]>
</conditionExpression>
</sequenceFlow>
- 这个例子调用了一个解析为boolean值的方法。
xml
<sequenceFlow id="flow" sourceRef="theStart" targetRef="theTask">
<conditionExpression xsi:type="tFormalExpression">
<![CDATA[${order.price > 100 && order.price < 250}]]>
</conditionExpression>
</sequenceFlow>
3.3、默认顺序流
3.3.1、描述
所有的BPMN 2.0任务与网关都可以使用默认顺序流(default sequence flow)。只有当没有其他顺序流可以选择时,才会选择默认顺序流作为活动的出口顺序流。流程会忽略默认顺序流上的条件。
3.3.2、图示
默认顺序流用起点带有"斜线"标记的一般顺序流表示。
3.3.3、XML表示
活动的默认顺序流由该活动的default属性定义。下面的XML片段展示了一个排他网关(exclusive gateway),带有默认顺序流flow 2。只有当conditionA与conditionB都计算为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>
四、网关
网关(gateway)用于控制执行的流向(或者按BPMN 2.0的用词:执行的"标志(token)")。网关可以消费(consuming)与生成(generating)标志。
网关用其中带有图标的菱形表示。该图标显示了网关的类型。

4.1、排他网关
描述
排他网关(exclusive gateway)用于对流程中的决策建模。当执行到达这个网关时,会按照所有出口顺序流定义的顺序对它们进行计算。选择第一个条件计算为true的顺序流(当没有设置条件时,认为顺序流为true)继续流程。
排他网关时,只会选择一条顺序流。当多条顺序流的条件都计算为true时,会且仅会选择在XML中最先定义的顺序流继续流程。如果没有可选的顺序流,会抛出异常。
图示
排他网关用内部带有'X'图标表示,'X'图标代表异或的含义。请注意内部没有图标的网关默认为排他网关。BPMN 2.0规范不允许在同一个流程中混合使用有及没有X的菱形标志。

XML表示
排他网关的XML表示格式很简洁:一行定义网关的XML。条件表达式定义在其出口顺序流上。查看条件顺序流章节了解这种表达式的可用选项。
以下面的模型为例:

其XML表示如下:
xml
<exclusiveGateway id="exclusiveGw" name="Exclusive Gateway" />
<sequenceFlow id="flow2" sourceRef="exclusiveGw" targetRef="theTask1">
<conditionExpression xsi:type="tFormalExpression">${input == 1}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow3" sourceRef="exclusiveGw" targetRef="theTask2">
<conditionExpression xsi:type="tFormalExpression">${input == 2}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow4" sourceRef="exclusiveGw" targetRef="theTask3">
<conditionExpression xsi:type="tFormalExpression">${input == 3}</conditionExpression>
</sequenceFlow>
4.2、并行网关
描述
网关也可以建模流程中的并行执行。在流程模型中引入并行的最简单的网关,就是并行网关(parallel gateway) 。
并行网关可以将执行分支(fork)为多条路径,也可以合并(join)多条入口路径的执行。
并行网关的功能取决于其入口与出口顺序流:
- 分支:所有的出口顺序流都并行执行,为每一条顺序流创建一个并行执行。
- 合并:所有到达并行网关的并行执行都会在网关处等待,直到每一条入口顺序流都到达了有个执行。然后流程经过该合并网关继续。
如果并行网关同时具有多条入口与出口顺序流,可以同时具有分支与合并的行为。在这种情况下,网关首先合并所有入口顺序流,然后分裂为多条并行执行路径。
与其他网关类型有一个重要区别:并行网关不计算条件。如果连接到并行网关的顺序流上定义了条件,会直接忽略该条件。
图示
并行网关,用内部带有'加号'图标的网关表示,代表与(AND)的含义。

XML表示
定义并行网关只需要一行XML:
xml
<parallelGateway id="myParallelGateway" />
4.3、包容网关
描述
可以把包容网关(inclusive gateway) 看做排他网关与并行网关的组合。与排他网关一样,可以在包容网关的出口顺序流上定义条件,包容网关会计算条件。然而主要的区别是,包容网关与并行网关一样,可以同时选择多于一条出口顺序流。
包容网关的功能取决于其入口与出口顺序流:
- 分支:流程会计算所有出口顺序流的条件。对于每一条计算为true的顺序流,流程都会创建一个并行执行。
- 合并:所有到达包容网关的并行执行,都会在网关处等待。直到每一条具有流程标志(process token)的入口顺序流,都有一个执行到达。这是与并行网关的重要区别。换句话说,包容网关只会等待可以被执行的入口顺序流。在合并后,流程穿过合并并行网关继续。
图示
包容网关,用内部带有'圆圈'图标的网关(菱形)表示。

XML表示
定义包容网关需要一行XML:
xml
<inclusiveGateway id="myInclusiveGateway" />

五、任务
5.1、用户任务
描述
"用户任务(user task)"用于对需要人工执行的任务进行建模。当流程执行到达用户任务时,会为指派至该任务的用户或组的任务列表创建一个新任务。
图示
用户任务用左上角有一个小用户图标的标准任务(圆角矩形)表示。

XML表示
用户任务在XML中如下定义。其中id是必须属性,name是可选属性
<userTask id="theTask" name="Important task" />
也可以为用户任务添加描述(description)。事实上任何BPMN 2.0元素都可以有描述。描述由documentation元素定义。
userTask id="theTask" name="Schedule meeting" >
<documentation>
Schedule an engineering meeting for next week with the new hire.
</documentation>
可以使用标准Java方式获取描述文本:
java
task.getDescription()
到期日期
每个任务都可以使用一个字段标志该任务的到期日期(due date)。可以使用查询API,查询在给定日期前或后到期的任务。
可以在任务定义中使用扩展指定表达式,以在任务创建时设定到期日期。该表达式必须解析为java.util.Date,java.util.String (ISO8601格式),ISO8601时间长度(例如PT50M),或者null。例如,可以使用在流程里前一个表单中输入的日期,或者由前一个服务任务计算出的日期。如果使用的是时间长度,则到期日期基于当前时间加上给定长度计算。例如当dueDate使用"PT30M"时,任务在从现在起30分钟后到期。
xml
<userTask id="theTask" name="Important task" flowable:dueDate="${dateVariable}"/>
任务的到期日期也可以使用TaskService,或者在TaskListener中使用传递的DelegateTask修改。
用户指派
用户任务可以直接指派(assign)给用户。可以定义humanPerformer子元素来实现。humanPerformer需要resourceAssignmentExpression来实际定义用户。目前,只支持formalExpressions。
xml
<process >
...
<userTask id='theTask' name='important task' >
<humanPerformer>
<resourceAssignmentExpression>
<formalExpression>kermit</formalExpression>
</resourceAssignmentExpression>
</humanPerformer>
</userTask>
只能指定一个用户作为任务的humanPerformer。在Flowable术语中,这个用户被称作办理人(assignee)。拥有办理人的任务,在其他人的任务列表中不可见,而只能在该办理人的个人任务列表中看到。
可以通过TaskService获取特定用户办理的任务:
java
List<Task> tasks = taskService.createTaskQuery().taskAssignee("kermit").list();
通过任务监听器自定义指派
在创建事件(create event)上使用任务监听器,调用自定义指派逻辑:
xml
<userTask id="task1" name="My task" >
<extensionElements>
<flowable:taskListener event="create" class="org.flowable.MyAssignmentHandler" />
</extensionElements>
</userTask>
传递至TaskListener的DelegateTask,可用于设置办理人与候选用户/组:
java
public class MyAssignmentHandler implements TaskListener {
public void notify(DelegateTask delegateTask) {
// 在这里执行自定义身份查询
// 然后调用如下命令:
delegateTask.setAssignee("kermit");
delegateTask.addCandidateUser("fozzie");
delegateTask.addCandidateGroup("management");
...
}
}
5.2、其他任务
5.2.1、脚本任务
脚本任务(script task)是自动执行的活动。当流程执行到达脚本任务时,会执行相应的脚本。
5.2.2、Java服务任务
Java服务任务(Java service task)用于调用Java类。
5.2.3、Web服务任务
Web服务任务(Web service task)用于同步地调用外部的Web服务。
5.2.4、邮件任务
Flowable让你可以通过自动的邮件服务任务(email task),增强业务流程。可以向一个或多个收信人发送邮件,支持cc,bcc,HTML文本,等等。请注意邮件任务不是BPMN 2.0规范的"官方"任务(所以也没有专用图标)。因此,在Flowable中,邮件任务实现为一种特殊的服务任务。
5.2.5、Http任务
Http任务(Http task)用于发出HTTP请求,增强了Flowable的集成能力。请注意Http任务不是BPMN 2.0规范的"官方"任务(所以也没有专用图标)。因此,在Flowable中,Http任务实现为一种特殊的服务任务。
5.2.6、任务监听器
任务监听器(task listener)用于在特定的任务相关事件发生时,执行自定义的Java逻辑或表达式。