Flowable学习(三)——BPMN 2.0

这里写目录标题

一、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" />

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b0ae70c848c44e26b0691481c7795c6f.png#pic_center)

五、任务

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逻辑或表达式。

相关推荐
西岸行者7 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意7 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码7 天前
嵌入式学习路线
学习
毛小茛7 天前
计算机系统概论——校验码
学习
babe小鑫7 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms7 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下7 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。7 天前
2026.2.25监控学习
学习
im_AMBER7 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J7 天前
从“Hello World“ 开始 C++
c语言·c++·学习