任务(task)和活动(activity)的区别在flowable中活动可以是多个任务的子流程、调用活动等合集。
2021-09-01T10:13:14时间例子
定时器事件开始时间默认为now();
事件
事件为流程生命周期中发生的事情建模。主要分类有两种,捕获事件和抛出事件。
捕获:当流程到达这个事件时,会等待触发器动作发生。捕获事件与抛出事件显示上的区别,是其内部的图标没有填充(即是白色的)。
抛出:当流程执行到达这个事件时,会触发一个触发器。出事件与捕获事件显示上的区别,是其内部的图标填充为黑色。
启动事件
是流程的起点。启动事件的类型(流程在消息到达时启动,在指定的时间间隔后启动,等等),定义了流程_如何_启动,并显示为启动事件中的小图标。
启动事件随时捕获:启动事件(保持)等候,直到特定的触发器被触发。
结束事件
结束事件(end event)标志着流程或子流程中一个分支的结束。结束事件总是抛出(型)事件。这意味着当流程执行到达结束事件时,会抛出一个_结果_。
边界事件
边界事件(boundary event)是_捕获型_事件,依附在活动(activity)上。边界事件永远不会抛出。这意味着当活动运行时,事件将_监听_特定类型的触发器。当_捕获_到事件时,会终止活动,并沿该事件的出口顺序流继续。
捕获中间事件
等待被触发。
中间抛出事件
抛出特定类型事件。
任务监听器
_任务监听器_包含下列属性:
- event(事件)(必填):触发任务监听器的任务事件类型。可用的事件有:
- create(创建):当任务已经创建,并且所有任务参数都已经设置时触发。
- assignment(指派):当任务已经指派给某人时触发。请注意:当流程执行到达用户任务时,在触发_create_事件之前,会首先触发_assignment_事件。这顺序看起来不太自然,但是有实际原因的:当收到_create_事件时,我们通常希望能看到任务的所有参数,包括办理人。
- complete(完成):当任务已经完成,从运行时数据中删除前触发。
- delete(删除):在任务即将被删除前触发。请注意任务由completeTask正常完成时也会触发。
执行监听器
执行监听器(execution listener)可以在流程执行中发生特定的事件时,执行外部Java代码或计算表达式。可以被捕获的事件有:
- 流程实例的启动和结束。
- 流程执行转移。
- 活动的启动和结束。
- 网关的启动和结束。
- 中间事件的启动和结束。
网关
排他网关
使用排他网关时,只会选择一条顺序流出口。当多条顺序流的条件都计算为true时,会且仅会选择在XML中最先定义的顺序流继续流程。如果没有可选的顺序流,会抛出异常
若有多条顺序流汇入,会从出口顺序流出多次,不会等待。
并行网关
分支:所有的出口顺序流都并行执行,为每一条顺序流创建一个并行执行。
合并:所有到达并行网关的并行执行都会在网关处等待,直到每一条入口顺序流都到达了有个执行。然后流程经过该合并网关继续。
并行网关汇入时或等待顺序流全部到达,若有顺序流条件为false时会阻塞,出口顺序流会忽略顺序流上的条件。
包容网关
分支:流程会计算所有出口顺序流的条件。对于每一条计算为true的顺序流,流程都会创建一个并行执行。
合并:所有到达包容网关的并行执行,都会在网关处等待。直到每一条具有流程标志(process token)的入口顺序流,都有一个执行到达。这是与并行网关的重要区别。换句话说,包容网关只会等待可以被执行的入口顺序流。在合并后,流程穿过合并并行网关继续。
入口顺序流或等待全部到达,若入口顺序流条件为false也会判断到达,出口顺序流会根据顺序流上的条件为true的出口出
事件网关
一个基于事件的网关,必须有两条或更多的出口顺序流。
基于事件的网关,只能连接至捕获中间事件
类型的元素(Flowable不支持在基于事件的网关之后连接“接收任务 Receive Task”)。
连接至基于事件的网关的捕获中间事件,必须只有一个入口顺序流。
子流程与调用活动
子流程(嵌入式子流程)
子流程主要两个用例:
- 允许折叠子流程,概览时实现端到端的查看。
折叠后:
折叠前:
限制:
- 一个子流程只能有一个空开始事件,不允许有其他开始事件类型
- BPMN2.0 规范中允许省略开始事件和结束事件,当前Flowable实现不支持这一点。
- 序列流(连线) 不允许跨过子流程的边界。
事件子流程
BPMN 2.0 中的新增功能。事件子流程是由事件触发的子流程
当创建托管事件子流程的范围(流程实例或子流程)时,会创建对开始事件的订阅。当范围被销毁时,订阅被删除。
Flowable 支持使用错误、计时器、信号和消息启动事件触发的事件子流程。
事件子流程也可以添加到嵌入式子流程中。如果将其添加到嵌入式子流程中,它将成为边界事件的替代方案。
事件子流程
边界事件:
差异:
- 使用嵌入式子流程时使用与执行它所在的作用域相同的执行来执行(可以访问作用域的局部变量),为执行嵌入的子流程而创建的执行被离开边界事件的序列流删除(子流程创建的变量不再可用)
- 使用事件子流程时,事件由子流程处理。使用边界事件时,事件由父进程处理。
事务子流程
事务子流程是一个嵌入式子流程,事务是一个逻辑工作单元,它允许对一组单独的活动进行分组,这样它们要么共同成功,要么共同失败。
三种结果:
- 事务没被取消也没有被异常终止,那么这个事务结果时成功的。如果事务子流程成功,则使用传出序列流留下它。
- 若执行到达取消结束事件时,事务被_取消(canceled)_。在这种情况下,所有执行都将被终止并移除。只会保留一个执行,设置为取消边界事件,并将触发补偿。在补偿完成后,事务子流程通过取消边界事件的出口顺序流离开。
- 若由于抛出了错误结束事件,且未被事务子流程所在的范围捕获,则事务会被_意外(hazard)_终止。错误被事件子流程的边界捕获也一样。在这种情况下,不会进行补偿。
BPMN的事务与ACID事务不同,
区别:
- ACID事务生存期一般比较短,而BPMN事务可以持续几小时,几天甚至几个月才完成调用活动引用一个流程定义外部的流程,子流程嵌入在源有的流程定义内,调用活动的主要场景是在不同的流程中做复用。
- 不可能将业务活动的持续时间限定为ACID事务的范围,因此一个BPMN事务通常会生成多个ACID事务。
- BPMN业务事务不使用传统方式回滚。这是因为它生成多个ACID事务,在BPMN事务取消时,部分ACID事务可能已经提交。这样它们没法回滚。
- BPMN通过补偿实现回滚。如果在事务范围内抛出了取消事件,就补偿所有成功执行并带有补偿处理器的活动所造成的影响。
调用活动(子流程)
子流程与调用活动区别
- 在BPMN 2.0中,调用活动(call activity)有别于一般的子流程,通常也称作_嵌入式子流程_。从概念上说,两者都在流程执行到达该活动时,调用一个子流程。
- 请注意,子流程的流程定义是在运行时解析的。这意味着如果需要,子流程可以独立于调用流程进行部署。
- 您可以将流程变量传递给子流程,反之亦然。数据在启动时复制到子进程中,并在结束时复制回主进程(需配置extensionElements)。您可以通过将选项 inheritVariables 设置为 true 将所有流程变量传递给子流程。
- 子流程还支持使用自定义 Flowable 属性扩展在子流程实例上设置businessKey。'businessKey' 属性可用于在子流程实例上设置自定义businessKey值。
- 要使用来自同一部署的引用流程,可以将sameDeployment属性设置true,通常都设置为true。