侧边栏壁纸
  • 累计撰写 2,058 篇文章
  • 累计创建 73 个标签
  • 累计收到 20 条评论

目 录CONTENT

文章目录

FlowableBPMN介绍

大猿本猿
2022-01-03 / 2,587 阅读 / 0 字

任务(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”)。

连接至基于事件的网关的捕获中间事件,必须只有一个入口顺序流。

子流程与调用活动

子流程(嵌入式子流程)

子流程主要两个用例:

  • 允许折叠子流程,概览时实现端到端的查看。

折叠后:

image

折叠前:

image

  • 子流程为事件创建了一个新的作用域,流程执行期间抛出的事件可以被子流程边界上的边界事件捕获,从而为该事件创建仅限于子流程的作用域。

image

限制:

  • 一个子流程只能有一个空开始事件,不允许有其他开始事件类型
  • BPMN2.0 规范中允许省略开始事件和结束事件,当前Flowable实现不支持这一点。
  • 序列流(连线) 不允许跨过子流程的边界。

事件子流程

BPMN 2.0 中的新增功能。事件子流程是由事件触发的子流程

当创建托管事件子流程的范围(流程实例或子流程)时,会创建对开始事件的订阅。当范围被销毁时,订阅被删除。

Flowable 支持使用错误、计时器、信号和消息启动事件触发的事件子流程。

事件子流程也可以添加到嵌入式子流程中。如果将其添加到嵌入式子流程中,它将成为边界事件的替代方案。

事件子流程

image

边界事件:

image

差异:

  • 使用嵌入式子流程时使用与执行它所在的作用域相同的执行来执行(可以访问作用域的局部变量),为执行嵌入的子流程而创建的执行被离开边界事件的序列流删除(子流程创建的变量不再可用)
  • 使用事件子流程时,事件由子流程处理。使用边界事件时,事件由父进程处理。

事务子流程

事务子流程是一个嵌入式子流程,事务是一个逻辑工作单元,它允许对一组单独的活动进行分组,这样它们要么共同成功,要么共同失败。

三种结果:

  1. 事务没被取消也没有被异常终止,那么这个事务结果时成功的。如果事务子流程成功,则使用传出序列流留下它。
  2. 若执行到达取消结束事件时,事务被_取消(canceled)_。在这种情况下,所有执行都将被终止并移除。只会保留一个执行,设置为取消边界事件,并将触发补偿。在补偿完成后,事务子流程通过取消边界事件的出口顺序流离开。
  3. 若由于抛出了错误结束事件,且未被事务子流程所在的范围捕获,则事务会被_意外(hazard)_终止。错误被事件子流程的边界捕获也一样。在这种情况下,不会进行补偿。

image

BPMN的事务与ACID事务不同,

区别:

  • ACID事务生存期一般比较短,而BPMN事务可以持续几小时,几天甚至几个月才完成调用活动引用一个流程定义外部的流程,子流程嵌入在源有的流程定义内,调用活动的主要场景是在不同的流程中做复用。
  • 不可能将业务活动的持续时间限定为ACID事务的范围,因此一个BPMN事务通常会生成多个ACID事务。
  • BPMN业务事务不使用传统方式回滚。这是因为它生成多个ACID事务,在BPMN事务取消时,部分ACID事务可能已经提交。这样它们没法回滚。
  • BPMN通过补偿实现回滚。如果在事务范围内抛出了取消事件,就补偿所有成功执行并带有补偿处理器的活动所造成的影响。

调用活动(子流程)

子流程与调用活动区别

  1. 在BPMN 2.0中,调用活动(call activity)有别于一般的子流程,通常也称作_嵌入式子流程_。从概念上说,两者都在流程执行到达该活动时,调用一个子流程。
  2. 请注意,子流程的流程定义是在运行时解析的。这意味着如果需要,子流程可以独立于调用流程进行部署。
  3. 您可以将流程变量传递给子流程,反之亦然。数据在启动时复制到子进程中,并在结束时复制回主进程(需配置extensionElements)。您可以通过将选项 inheritVariables 设置为 true 将所有流程变量传递给子流程。
  4. 子流程还支持使用自定义 Flowable 属性扩展在子流程实例上设置businessKey。'businessKey' 属性可用于在子流程实例上设置自定义businessKey值。
  5. 要使用来自同一部署的引用流程,可以将sameDeployment属性设置true,通常都设置为true。