Flowable实战(四)BPMN2.0 启动与结束事件
一、BPMN2.0
BPMN2.0规范是一个标准,开源框架和不同供应商都遵循这份标准,使得最终用户不会因为依赖专有解决方案,而被供应商“绑架”。有了BPMN2.0标准,不同解决方案之间的迁移,变得十分简单平滑。
缺点则是标准通常是不同观点大量讨论与妥协的结果,有些结构或方法会十分笨重。Flowable在实现规范的基础上进行了功能和使用性扩展。
- 自定义扩展是在标准方式的基础上进行简化。因此当你决定使用自定义扩展时,仍然可以用标准方式。
- 使用自定义扩展时,总是通过flowable:命名空间前缀,明确标识出XML元素、属性等。
- Flowable引擎也支持activiti:命名空间前缀。
注:在官方文档中,启动和结束事件已有较详细的介绍,是英文版。启动和结束事件是流程里重要的内容,现在做个汇总整理。
二、启动事件
启动事件(start event)是流程的起点。
- 启动事件在XML中,类型由子元素声明来定义。
- 启动事件保持等候状态,直到特定的触发器被触发。
- 启动事件是细线图形。
2.1 空启动事件
2.1.1 描述
空启动事件(none Start Event),指的是未指定触发器,由用户调用的启动事件。
2.1.2 图示
空启动事件用空心圆圈表示,中间没有图标(也就是说,没有触发器)。

2.1.3 XML表示
空启动事件的XML表示格式,就是普通的启动事件声明,而没有任何子元素(其他种类的启动事件都有用于声明其类型的子元素)。
<startEvent id="start" name="my start event" />
2.1.4 使用方法:
ProcessInstance processInstance = runtimeService.startProcessInstanceByXXX();
2.1.5 自定义扩展
formKey: 引用表单定义,用户需要在启动时填写的表单。(目前只需了解到启动事件可以绑定表单即可,详细内容在表单章节中讲解。)
<startEvent id="request" flowable:formKey="simpleForm" />
2.2 定时器启动事件
2.2.1 描述
定时器启动事件(timer start event)在指定时间内创建一次或多次的流程实例。
定时器启动事件,在流程部署的同时就开始计时。不需要调用startProcessInstanceByXXX就会在时间启动。调用startProcessInstanceByXXX时会在定时启动之外额外启动一个流程。
当部署带有定时器启动事件的流程的更新版本时,上一版本的定时器作业会被移除。这是因为通常并不希望旧版本的流程仍然自动启动新的流程实例。
2.2.2 图示
定时器启动事件,用其中有一个钟表图标的圆圈来表示。

2.2.3 XML表示
定时器启动事件的XML表示格式,是普通的启动事件声明加上定时器定义子元素。
定时器定义必须且只能包含下列的一种元素:
- timeDate。这个元素指定了ISO 8601格式的固定时间。在这个时间就会触发触发器。例如:
<timerEventDefinition>
<timeDate>2022-01-11T12:13:14</timeDate>
</timerEventDefinition>
- timeDuration。要定义定时器需要等待多长时间再触发,同样使用ISO 8601格式(BPMN 2.0规范要求)。例如(等待10天):
<timerEventDefinition>
<timeDuration>P10D</timeDuration>
</timerEventDefinition>
timeCycle。指定重复周期,可用于周期性启动流程。例如(重复三次启动,每次间隔为10小时,到指定时间时结束重复):
<timerEventDefinition>
<timeCycle>R3/PT10H/2022-01-12T23:59:59+00:00</timeCycle>
</timerEventDefinition>
也可以使用变量,如${EndDate}
<timerEventDefinition>
<timeCycle>R3/PT10H/${EndDate}</timeCycle>
</timerEventDefinition>
2.3 消息启动事件
2.3.1 描述
消息启动事件(message start event)使用具名消息启动流程实例。消息名用于定位指定的启动事件。
当部署具有一个或多个消息启动事件的流程定义时,会做如下判断:
- 一个流程定义不得包含多个同名的消息启动事件。
- 在流程定义中,一个或多个消息启动事件引用了已经部署的另一流程定义中消息启动事件的消息名,则会抛出异常。
- 流程版本:在部署流程定义的新版本时,会取消上一版本的消息订阅,即使新版本中并没有这个消息事件。
2.3.2 图示
消息启动事件用其中有一个消息事件标志的圆圈表示。这个标志并未填充,用以表示捕获(接收)行为。

2.3.3 XML表示
消息启动事件的XML表示格式,为普通启动事件声明加上messageEventDefinition子元素:
<definitions id="definitions"
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:flowable="http://flowable.org/bpmn"
targetNamespace="Examples"
xmlns:tns="Examples">
<message id="newInvoice" name="newInvoiceMessage" />
<process id="invoiceProcess">
<startEvent id="messageStart" >
<messageEventDefinition messageRef="tns:newInvoice" />
</startEvent>
...
</process>
</definitions>
2.3.4 使用方法
在启动流程实例时,可以使用下列RuntimeService中的方法,触发消息启动事件:
ProcessInstance startProcessInstanceByMessage(String messageName);
ProcessInstance startProcessInstanceByMessage(String messageName, Map<String, Object> processVariables);
ProcessInstance startProcessInstanceByMessage(String messageName, String businessKey,
Map<String, Object< processVariables);
messageName是由message元素的name属性给定的名字。messageEventDefinition的messageRef属性会引用message元素。
2.4 信号启动事件
2.4.1 描述
信号启动事件(signal start event),使用具名信号启动流程实例。
2.4.2 图示
信号启动事件用其中有一个信号事件标志的圆圈表示。这个标志并未填充,用以表示捕获(接收)行为。

2.4.3 XML表示
信号启动事件的XML表示格式,为普通启动事件声明,加上signalEventDefinition子元素:
<signal id="theSignal" name="The Signal" />
<process id="processWithSignalStart1">
<startEvent id="theStart">
<signalEventDefinition id="theSignalEventDefinition" signalRef="theSignal" />
</startEvent>
<sequenceFlow id="flow1" sourceRef="theStart" targetRef="theTask" />
<userTask id="theTask" name="Task in process A" />
<sequenceFlow id="flow2" sourceRef="theTask" targetRef="theEnd" />
<endEvent id="theEnd" />
</process>
2.4.4 使用方法
信号可以由流程实例中的信号抛出中间事件(intermediary signal throw event),或者API(runtimeService.signalEventReceivedXXX方法)触发。
两种方式都会启动所有拥有相同名字信号启动事件的流程定义。
请注意可以选择异步还是同步启动流程实例。
需要为API传递的signalName,是由signal元素的name属性决定的名字。signal元素由signalEventDefinition的signalRef属性引用。
注意:消息与信号的区别:消息是一对一的,一个消息只能启动一个流程事件。信号是全局的,广播式的,一个信号可以启动多个流程事件。
2.5 异常启动事件
2.5.1 描述
异常启动事件(error start event),可用于触发事件子流程(Event Sub-Process)。错误启动事件不能用于启动流程实例。
2.5.2 图示
异常启动事件用其中有一个异常事件标志的圆圈表示。这个标志并未填充,用以表示捕获(接收)行为。

2.5.3 XML表示
异常启动事件的XML表示格式,为普通启动事件声明加上errorEventDefinition子元素:
<startEvent id="messageStart" >
<errorEventDefinition errorRef="someError" />
</startEvent>
三、结束事件
结束事件(end event)标志着流程或子流程中一个分支的结束。结束事件总是抛出(型)事件。这意味着当流程执行到达结束事件时,会抛出一个结果。结果的类型由事件内部的黑色图标表示。在XML表示中,类型由子元素声明给出。
3.1 空结束事件
3.1.1 描述
空结束事件(none end event),意味着当到达这个事件时,没有特别指定抛出的结果。因此,引擎除了结束当前执行分支之外,不会多做任何事情。
3.1.2 图示
空结束事件,用其中没有图标(没有结果类型)的粗圆圈表示。

3.1.3 XML表示
空事件的XML表示格式为普通结束事件声明,没有任何子元素(其它种类的结束事件都有子元素,用于声明其类型)。
<endEvent id="end" name="my end event" />
3.2 异常结束事件
3.2.1 描述
当流程执行到达异常结束事件(error end event)时,结束执行的当前分支,并抛出错误。
3.2.2 图示
异常结束事件事件用内部有一个异常图标的标准结束事件(粗圆圈)表示。异常图标是全黑的,代表抛出的含义。

3.2.3 XML表示
异常结束事件表示为结束事件,加上errorEventDefinition子元素:
<endEvent id="myErrorEndEvent">
<errorEventDefinition errorRef="myError" />
</endEvent>
errorRef属性可以引用在流程外定义的error元素:
<error id="myError" errorCode="123" />
...
<process id="myProcess">
...
error的errorCode用于查找匹配的异常捕获边界事件。如果errorRef不匹配任何已定义的error,则该errorRef会用做errorCode的快捷方式。这个快捷方式是Flowable特有的。下面的代码片段在功能上是相同的。
<error id="myError" errorCode="error123" />
...
<process id="myProcess">
...
<endEvent id="myErrorEndEvent">
<errorEventDefinition errorRef="myError" />
</endEvent>
...
与下面的代码功能相同
<endEvent id="myErrorEndEvent">
<errorEventDefinition errorRef="error123" />
</endEvent>
请注意errorRef必须遵从BPMN 2.0规范。
3.3 终止结束事件
3.3.1 描述
当到达终止结束事件(terminate end event)时,当前的流程实例或子流程会被终止。也就是说,当执行到达终止结束事件时,会判断第一个范围 scope(流程或子流程)并终止它。请注意在BPMN 2.0中,子流程可以是嵌入式子流程,调用活动,事件子流程,或事务子流程。有一条通用规则:当存在多实例的调用过程或嵌入式子流程时,只会终止一个实例,其他的实例与流程实例不会受影响。
可以添加一个可选属性terminateAll。当其为true时,无论该终止结束事件在流程定义中的位置,也无论它是否在子流程(甚至是嵌套子流程)中,都会终止(根)流程实例。
3.3.2 图示
终止结束事件用内部有一个全黑圆的标准结束事件(粗圆圈)表示。

3.3.4 XML表示
终止结束事件,表示为结束事件,加上terminateEventDefinition子元素。
请注意terminateAll属性是可选的(默认为false)。
<endEvent id="myEndEvent >
<terminateEventDefinition flowable:terminateAll="true"></terminateEventDefinition>
</endEvent>
3.4 取消结束事件
3.4.1 描述
取消结束事件(cancel end event)只能与BPMN事务子流程(BPMN transaction subprocess)一起使用。当到达取消结束事件时,会抛出取消事件,且必须由取消边界事件(cancel boundary event)捕获。取消边界事件将取消事务,并触发补偿(compensation)。
3.4.2 图示
取消结束事件用内部有一个取消图标的标准结束事件(粗圆圈)表示。取消图标是全黑的,代表抛出的含义。

3.4.3 XML表示
取消结束事件,表示为结束事件,加上cancelEventDefinition子元素。
<endEvent id="myCancelEndEvent">
<cancelEventDefinition />
</endEvent>
四、小结
理论是实践的基础,本篇汇总BPMN2.0 规范和Flowable扩展下的启动和结束事件,为后面的实战做准备。
Flowable实战(四)BPMN2.0 启动与结束事件的更多相关文章
- Flowable实战(一)启动第一个完整流程
一.前言: 发现网上关于Flowable的资料基本都是浅尝辄止,对如何构建一个企业级的流程应用说明很少,所以写个实战系列,希望对大家和自己,都有所帮助. 二.认识Flowable Flowab ...
- activiti5/6 系列之--Activiti与BPMN2.0规范相关节点对应关系
根据BPMN2.0规范的分类划分为以下部分: 1.启动与结束事件(event) 2.顺序流(Sequence Flow) 3.任务(Task) 4.网关(Gateway) 5.子流程(Subproce ...
- Activiti工作流与BPMN2.0规范
本章内容根据BPMN2.0规范的分类划分为以下部分: 1.启动与结束事件(event) 2.顺序流(Sequence Flow) 3.任务(Task) 4.网关(Gateway) 5.子流程(Subp ...
- Flowable实战(八)BPMN2.0 任务
任务是流程中最重要的组成部分.Flowable提供了多种任务类型,以满足实际需求. 常用任务类型有: 用户任务 Java Service任务 脚本任务 业务规则任务 执行监听器 任务监听器 多 ...
- Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素
Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...
- gRPC学习之四:实战四类服务方法
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Flowable实战(七)用户和组
在流程中,最重要的参与者是用户.流程定义了任务何时需要用户参与,什么用户可以参与. 组可以理解为我们常说的角色. Flowable中内置了一套简单的对用户和组的支持,身份管理(IDM ID ...
- coreseek实战(四):php接口的使用,完善php脚本代码
coreseek实战(四):php接口的使用,完善php脚本代码 在上一篇文章 coreseeek实战(三)中,已经能够正常搜索到结果,这篇文章主要是把 index.php 文件代码写得相对完整一点点 ...
- BPMN2.0 规范
1 启动事件 每个流程总是以启动事件作为入口,启动事件在BPMN2.0 中以细线圆圈表示.分为三种类型 空启动事件 定时启动事件 异常启动事件 消息启动事件 启动事件都是等待第三方触发才可以启动. 定 ...
随机推荐
- Spring5 AOP编程:关于org.springframework.beans.factory.BeanNotOfRequiredTypeException报错
Spring5 AOP编程:关于org.springframework.beans.factory.BeanNotOfRequiredTypeException报错 先上错误详细信息: org.spr ...
- 韩顺平Java(持续更新中)
原创上课笔记,转载请注明出处 第一章 面向对象编程(中级部分) PDF为主 1.1 IDEA 删除当前行,ctrl+y 复制当前行,ctrl+d 补全代码,alt+/ 添加或者取消注释,ctrl+/ ...
- Spring核心原理分析之MVC九大组件(1)
本文节选自<Spring 5核心原理> 1 什么是Spring MVC Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 S ...
- ligerUI问题
1.checkboxColWidth:990,Grid的复选框的宽度设置为什么不起作用. 2.当grid出现横线不对齐时,可以设置detailColWidth:90,属性进行设置.此属性好像只是针对复 ...
- Shell bash和sh区别
Shell 中文意思贝壳,寓意类似内核的壳.Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务.Shell 是一个用 C 语言编写的程序,它是用户使用 Li ...
- 移动端滚动方案:better-scroll
BetterScroll 是什么 BetterScroll 是一款重点解决移动端(已支持 PC)各种滚动场景需求的插件.它的核心是借鉴的 iscroll (opens new window) 的实现, ...
- 制作一个文档同步工具,自动同步到gitee中。。。
之所以要做这个工具是为了让自己可以随时用电脑时能记录日常工作或生活.一般只需要简单记录下就行了.这样我在家里的和公司里的记录都能同步看到. 这样后期整理的时候看到几个关键词就能想起来具体的事情,有的也 ...
- .Net Core 文件打包压缩
最近项目需要实现多文件打包的功能,尝试了一些方法,最后发现使用 ICSharpCode.SharpZipLib 最符合项目的要求. 具体实现如下: 1.在 Nuget 中安装 ICSharpCod ...
- 使用proxy解决请求跨域问题
背景 在 react 项目里,前端请求接口时出现了跨域问题(类似图片中的提示) 这时最快捷的方法就是让后端同学设置请求允许跨域(如图配置响应头) 如果后端同学不配合,就需要靠我们自己来了! 实现 Re ...
- 【LeetCode】839. 相似字符串组 Similar String Groups (Python)
作者: 负雪明烛 id: fuxuemingzhu 公众号:每日算法题 本文关键词:LeetCode,力扣,算法,算法题,字符串,并查集,刷题群 目录 题目描述 解题思路 并查集 代码 刷题心得 欢迎 ...