Flowable-多实例

news2024/11/24 10:41:23

目录

    • 概述
    • 概念
    • 多实例配置
      • 图形标记
      • XML内容
      • 界面操作
      • 视频教程

BPMN2.0 中引入了多实例的概念,它是在业务流程中定义“重复”环节的一个方法,Flowable
对其予以了支持。配置为多实例的活动在流程运行时会创建多个活动实例,既可以顺序依次执行也
可以并行同时执行,效果相当于在这个活动上循环反复执行,并在满足设置的结束条件后退出循环。
BPMN 中的多种节点可以设置为多实例,从而在流程中实现各种“重复”执行的特性,满足特定的
需求场景。本章将介绍 Flowable 中的多实例的配置方法,并结合示例介绍多实例在多种常见的活动
或子流程上的应用。

概述

BPMN 中的多实例活动是实现循环的方式之一。虽然循环总是可以通过活动连接网关将后续顺
序流指向自己或前面的活动来实现,但是多实例活动是可以在某些情况下实现起来更简单。如果想
让某些特定的活动重复执行多次,我们可以将该活动设置为多实例,让其按照配置来执行相应的次
数。

概念

多实例活动是在业务流程中定义重复环节的方式。从开发角度讲,多实例相当于循环,它可以
根据给定的集合,为每个元素顺序或并行地执行某个环节,甚至是一个子流程。
所谓多实例是在一个普通的活动上添加了额外的属性定义(被称作“多实例特性”),这样活
动在运行时被执行多次。以下几种活动可以设置为多实例活动:

  • 用户任务(User Task)
  • 脚本任务(Script Task)
  • 服务任务(Java Service Task)
  • Web 服务任务(Web Service Task)
  • 业务规则任务(Business Rule Task)
  • 电子邮件任务(Email Task)
  • 手动任务(Manual Task)
  • 接收任务(Receive Task)
  • (嵌入式)子流程(Embedded Sub-Process)
  • 调用活动(Call Activity)
    需要注意的是,网关(Gateway)和事件(Event)不能设置为多实例的。
    按照 BPMN 2.0 规范的要求,在 Flowable 的设计中,为每个实例创建的执行的父执行都有如表所示的变量:

多实例的父执行内置变量

变量名含义
nrOfInstances实例总数。
nrOfActiveInstances当前活动的(尚未完成的)实例数量。对于串行多实例来说,这个值始终是 1。
nrOfCompletedInstances已经完成的实例的数量。

以上这三个变量值可以通过 execution.getVariable(x)方法获取。
另外,每个创建的执行都会有一个执行本地变量,如表 24.2 所示,它对于其它执行不可见,
并且不存储在流程实例级别:

多实例的子执行内置变量

变量名含义
loopCounter表示特定实例的在循环的索引值。loopCounter 变量可以使用 flowable 的 elementIndexVariable 属性重命名。

多实例配置

图形标记

如果一个活动被设置为多实例,则在活动底部用三条短线表示。通过短线的朝向决定多实例的
类型,三条竖线表示是并行多实例(并行执行),三条横线表示串行多实例(顺序执行)。如图所示:

在这里插入图片描述

XML内容

如果要将一个活动设置为多实例活动 ,需要为该活动的XML元素必须设置一个
multiInstanceLoopCharacteristics 子元素:

<multiInstanceLoopCharacteristics isSequential="false|true">
...
</multiInstanceLoopCharacteristics>
  1. 多实例类型的配置

其中,isSequential属性表示多实例的类型,isSequential="false"表示是并行多实例 ,
isSequential="true"表示是串行多实例。

  1. 多实例的数量计算
    在进入活动时会计算一次多实例的数量,Flowable 提供了多种配置方法进行配置:

2.1. 使用 loopCardinality 子元素指定
这种方法是使用 loopCardinality 子元素直接指定一个数字作为多实例的数量:

    <multiInstanceLoopCharacteristics isSequential="false|true">
         <loopCardinality>6</loopCardinality>
    </multiInstanceLoopCharacteristics>

使用这种方式时,也可以配置为执行结果为整数的表达式:

<multiInstanceLoopCharacteristics isSequential="false|true">
    <loopCardinality>${nrOfOrders-nrOfCancellations}</loopCardinality>
</multiInstanceLoopCharacteristics>

2.2、使用 loopDataInputRef 子元素指定
另一种定义实例数的方法是使用 loopDataInputRef 子元素指定设置一个类型为集合的流程变量
名。对于集合中的每个元素,都会创建一个实例。另外,也可以使用 inputDataItem 子元素配置存
储集合元素的变量名(可选)。以用户任务为例,使用方式见如下的示例:

<userTask id="userTask1" name="多实例用户任务" flowable:assignee="${assignee}">
    <multiInstanceLoopCharacteristics isSequential="false">
        <loopDataInputRef>assigneeList</loopDataInputRef>
        <inputDataItem name="assignee" />
    </multiInstanceLoopCharacteristics>
</userTask>

上面通过 loopDataInputRef 子元素指定了类型为集合的 assigneeList 流程变量,同时通过
inputDataItem 子元素设置 assignee。假设 assigneeList 变量的值包括 zhangsan、lisi、wangwu,那么
在以上的配置中,三个用户任务会同时创建(并行多实例)。并且,每个执行都会拥有一个名为
assignee 的流程变量,它会包含集合中的对应元素,在本例中用于分配用户任务。
使用这种方式配置,存在以下两个缺点:1)loopDataInputRef 和 inputDataItem 的名称不太好
记;2)根据 BPMN 2.0 格式定义,它们不能包含表达式。为了解决这个问题,Flowable 提供了下面
的第3种方式。
2.3、通过 collection 和 elementVariable 属性指定
为了解决第②种方式中存在的问题,Flowable 为 multiInstanceCharacteristics 引入了 collection 和
elementVariable 属性:

  <userTask id="userTask1" name="多实例用户任务" flowable:assignee="${assignee}">
  <multiInstanceLoopCharacteristics isSequential="true"
  flowable:collection="${myTaskUserService.getUsersOfTask()}"
  flowable:elementVariable="assignee" >
  </multiInstanceLoopCharacteristics>
  </userTask>

对比一下可以看出,这里其实是使用 collection 属性替代了第2种方式的 loopDataInputRef 子
元素,使用 elementVariable 属性替代了 inputDataItem 子元素,不同之处是 collection 属性可以配置
为一个表达式,使用起来更加灵活。
需要注意的是,collection 属性会作为表达式进行解析。如果表达式执行结果为字符串而不是
集合,不论是因为本身配置的就是静态字符串值,还是表达式执行结果为字符串,这个字符串都会
被当做变量名,其变量值为实际的集合。我们看下面的示例:

<userTask id="userTask1" name="多实例用户任务" flowable:assignee="${assignee}">
<multiInstanceLoopCharacteristics isSequential="true"
flowable:collection="assigneeList" flowable:elementVariable="assignee" >
</multiInstanceLoopCharacteristics>
</userTask>

在以上配置中,需要将集合存储在 assigneeList 流程变量中。
为了进一步说明,我们再看下一个示例:

<userTask id="userTask1" name="多实例用户任务" flowable:assignee="${assignee}">
<multiInstanceLoopCharacteristics isSequential="true"
flowable:collection="${myTaskUserService.getCollectionVariableName()}"
flowable:elementVariable="assignee" >
</multiInstanceLoopCharacteristics>
</userTask>

在以上配置中,如果表达式 myTaskUserService.getCollectionVariableName()执行结果是一个字
符串值,引擎就会用这个字符串值作为变量名,获取流程变量保存的集合。
3、多实例结束条件配置
Flowable 默认在所有的实例都完成后,多实例活动才结束。 同时, Flowable 提供了
completionCondition 子元素用于配置评估是否结束多实例的表达式,这个表达式在每个实例结束时
执行一次,如果表达式计算结果为 true,则当前多实例中所有剩余的实例将被销毁,并且多实例活
动结束,流程离开当前活动继续执行;如果表达式计算结果为 false,则继续等待剩下的实例完成。
我们看下面一个示例:

<userTask id="miTasks" name=" " flowable:assignee="${assignee}">
<multiInstanceLoopCharacteristics isSequential="false"
flowable:collection="assigneeList" flowable:elementVariable="assignee" >
<completionCondition>${nrOfCompletedInstances/nrOfInstances >=
0.5 }</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>

在以上配置中,将会为 assigneeList 集合的每个元素创建一个并行的实例。当 50%的任务完成
时,其他任务就会被删除,流程继续往下执行。

界面操作

在这里插入图片描述

视频教程

多实例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/848808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

海外市场裂变营销:打造爆炸式增长的成功之道

随着全球化的加速发展&#xff0c;越来越多的品牌开始将目光投向海外市场。然而&#xff0c;在激烈的国际竞争中脱颖而出&#xff0c;并在海外市场取得成功并不容易。在这样的背景下&#xff0c;裂变营销成为了一个备受关注的策略&#xff0c;它能够帮助品牌在海外市场快速拓展…

vue3 excel 导出功能

1.安装 xlsx 库 npm install xlsx2.创建导出函数 src/utils/excelUtils.js import * as XLSX from xlsx;const exportToExcel (fileName, datas, sheetNames) > {// 创建工作簿const wb XLSX.utils.book_new()for (let i 0; i < datas.length; i) {let data datas…

教雅川学缠论06-中枢

本系列文章之前讲的内容都只有上升和下降两类趋势&#xff0c;并没有提及盘整&#xff0c;在缠论中&#xff0c;中枢这个新词汇用来定义盘整&#xff0c;中枢&#xff1a; 1.至少由5条线段&#xff08;或笔&#xff09;组成 2.中枢是有方向的&#xff0c;中枢左右两侧外面的线&…

C语言文件操作基本方法

1、文件的分类 ANSI C 的缓冲文件系统 缓冲文件系统 缓冲文件系统是指&#xff0c;系统自动地在内存区为每个正在使用的文件开辟一个缓冲区。 从内存向磁盘输出数据时&#xff0c;必须首先输出到缓冲区中。待缓冲区装满后&#xff0c;再一起输出到磁盘文件中。 从磁盘文件向内…

lz4 与 lz77 压缩算法举例

lz4算法 abcd efab cdeh 压缩过程&#xff1a; 以长度&#xff14;为滑窗&#xff0c;&#xff11;为步长&#xff0c;对abcd计算hash存入hash table&#xff0c;计算 bcde, cdef,defa,efab,fabc的 hash 分别加入 hash table&#xff0c;下一个滑窗 abcd 找到了匹配&#xf…

Acwing.883 高斯消元解线性方程组

题目 输入一个包含n个方程n个未知数的线性方程组。 方程组中的系数为实数。 求解这个方程组。 下图为一个包含m个方程n个未知数的线性方程组示例: 输入格式 第一行包含整数n。 接下来n行&#xff0c;每行包含n1个实数&#xff0c;表示一个方程的n个系数以及等号右侧的常数。 …

Spark Catalog详解

前言 旁边的实习生说:我想要用spark代码中对hive库中的内部表和外部表进行删除(包括数据),咋感觉网上搜了一圈都找不到解决方案啊,spark这么鸡肋吗? 我:你应该静下心来好好把spark基础知识进行全面学习。 实习生:难道spark有这功能,而我没有学习过?咋弄啊? 我:学习…

WinForm项目打包成一个exe安装包教程(VS2022)

目录 1、下载扩展Microsoft Visual Studio Installer Projects 2、新建Set up项目 3、应用程序文件夹下添加文件 4、添加卸载程序 5、添加运行环境 6、添加程序图标&#xff08;选做&#xff09; 7、生成项目exe 1、下载扩展Microsoft Visual Studio Installer Projects…

深入篇【C++】C++<继承>特性详细总结附代码案例(单继承/多继承)

深入篇【C】C<继承>特性详细总结(单继承/多继承&#xff09; Ⅰ.继承理解Ⅱ.继承方式Ⅲ.基类派生类对象赋值转化Ⅳ.继承中同名成员Ⅴ.派生类的默认成员函数Ⅵ.继承中友元与静态Ⅶ.多继承<菱形继承问题>Ⅷ.继承与组合 Ⅰ.继承理解 继承的本质就是复用&#xff0c;而…

螺旋模型四象限指的是什么?

螺旋模型融合了瀑布模型、快速原型模型&#xff0c;最大的优点强调了风险分析&#xff0c;有助于将软件质量融入开发中;小分段构建大型软件&#xff0c;易于计算成本;客户参与&#xff0c;保证项目可控性。但构建过程太过繁琐&#xff0c;适合大型项目不适合小型项目。 上图是螺…

通信原理板块——基础知识(一)

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 1、通信的基本概念——消息、信息和…

【QT】 QTabWidgetQTabBar控件样式设计(QSS)

很高兴在雪易的CSDN遇见你 &#xff0c;给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 本文分享QT控件QTabWidget&QTabBar的样式设计&#xff0c;介绍两者可以自定义的内容&#xff0c;以及如何定义&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴…

内生安全构建数据存储

一、数据安全成为防护核心&#xff0c;存储安全防护不容有失 1、数据作为企业的核心资产亟需重点保护&#xff0c;数据安全已成网络空间防护核心 2、国家高度重视关键信息基础设施的数据安全&#xff0c;存储安全已成为审核重点 二、存储安全是数据安全的关键一环&#xff0c;应…

Linux6.35 Kubernetes Pod详解

文章目录 计算机系统5G云计算第三章 LINUX Kubernetes Pod详解一、Pod基础概念1.在Kubrenetes集群中Pod有如下两种使用方式2.pause容器使得Pod中的所有容器可以共享两种资源&#xff1a;网络和存储3.kubernetes中的pause容器主要为每个容器提供以下功能4.Kubernetes设计这样的P…

VBA技术资料MF41:VBA_将常规数字转换为文本数字

【分享成果&#xff0c;随喜正能量】时有落花至&#xff0c;远随流水香。人生漫长&#xff0c;不攀缘&#xff0c;不强求&#xff0c;按照自己喜欢的方式生活&#xff0c;不必太过在意&#xff0c;顺其自然就好。路再长也有终点&#xff0c;夜再黑也有尽头。 我给VBA的定义&am…

纯鸿蒙!华为HarmonyOS NEXT不再兼容安卓应用,无法安装Apk文件

8月7日消息&#xff0c;近日&#xff0c;华为举行2023年华为开发者大会&#xff08;HDC.Together&#xff09;上&#xff0c;除了发布HarmonyOS 4、全新升级的鸿蒙开发套件外&#xff0c;华为还带来了HarmonyOS NEXT开发者预览版。 据了解&#xff0c;HarmonyOS NEXT开发者预览…

Android Framework解析——WMS原理

作者&#xff1a;bobby_developer 1. WMS原理&#xff1a;WMS角色与实例化过程 window:它是一个抽象类&#xff0c;具体实现类为 PhoneWindow &#xff0c;它对 View 进行管理。Window是View的容器&#xff0c;View是Window的具体表现内容&#xff1b; windowManager:是一个接…

个人玩具小程序商城制作攻略,不容错过

在如今的移动互联网时代&#xff0c;小程序成为了企业和个人开展业务的重要工具。如果你是一个小白用户&#xff0c;想要打造一个玩具小程序商城&#xff0c;但又没有编程基础&#xff0c;不用担心&#xff01;本文将通过乔拓云提供的简单操作步骤&#xff0c;教你如何轻松实现…

林【2019】

关键字&#xff1a; 哈夫曼树权值最小、哈夫曼编码、邻接矩阵时间复杂度、二叉树后序遍历、二叉排序树最差时间复杂度、非连通无向图顶点数&#xff08;完全图&#xff09;、带双亲的孩子链表、平衡二叉树调整、AOE网关键路径 一、判断 二、单选 三、填空 四、应用题 五、算…

VScode中同时打开两个脚本

使用快捷键&#xff1a; CtrlAltRightArrow 效果&#xff1a; 可以看到&#xff0c;上述两个脚本使用独立的窗口进行编辑和查看。