BPMN2.0规范及流程引擎选型方案

news2024/10/6 8:22:15

BPMN2.0规范及流程引擎选型方案

  • 一、基本概念
  • 二、BPMN意义
  • 三、主要元素
    • 3.1 活动
      • 任务
      • 子流程
      • 调用活动
      • 事件子流程
      • 事务
    • 3.2 网关
      • 排他网关
      • 包容网关
      • 并行网关
      • 事件网关
    • 3.3 事件
      • 开始事件
      • 结束事件
      • 中间事件
    • 3.4 辅助
      • 泳道图
      • 注释与组
      • 数据存储
  • 四、图类型
    • 4.1 编排图
    • 4.2 会话图
  • 五、技术选型
    • 5.1 前端
      • BPMN.JS
      • LogicFlow
      • [AntV X6](https://github.com/antvis/X6)
    • 5.2 后台
      • Activiti
      • Flowable
      • Compileflow
  • 六、总结

大家好,我是比特桃。本文主要简明扼要的介绍了BPMN2.0规范的内容,可让读者快速度的了解BPMN2.0所涵盖的主要内容和图形样式。也较为详细的阐述了如何绘制标准的流程图,以及在软件层面中如何实现业务流程功能,和技术选型。

一、基本概念

我们生活中存在了大量的业务流程,大到结婚买房,小到请假买票。都需要按照规定的流程办事,如果流程比较简单我们可以通过画点草图来让大家理解。但当业务过于复杂的时候,如果没有一个业务流程图的规范,恐怕很难让人和机器看懂。为了让全球各种业务流程图能统一,就出现了BPMN(Business Process Model and Notation)标准,该标准已经成为了ISO标准之一(标准下载)。
BPMN发展历史
BPMN2.0主要规范了图形,像UML图一样,也就是我们看到图就明白这个业务流的逻辑。那实际系统如何去根据图形去实现控制运转,这是属于工作流引擎要做的事情,像工作流运行中的控制模式,就得参考Control-Flow Patterns。需要重点说明的是,现在知名工作流引擎:Activiti、Flowable、Camunda还有国内的炎黄盈动等,都是自称支持BPMN2.0规范。实际他们的运行逻辑、属性标识、存储结构都是大致相同,但略有区别,是不能跨流程引擎通用的。比如符合BPMN2.0规范的开始事件的XML格式一般叫<startEvent>,但网关的引擎内部定义就不太一样了,有的工作流引擎甚至不会采用XML格式而是JSON格式存储。所以流程引擎所谓的支持BPMN2.0,只是功能及外观遵循了标准。实际软件层面的实现,是可以根据自身需求来的。对于第一次接触BPMN2.0规范的来说,区分这个概念至关重要。

二、BPMN意义

使用图形规范的意义就是为了让所有能看懂,就和我们现实中的语言一样。除此之外,在这样一个信息化的时代,我们有太多软件业务去处理现实中复杂的流程了。比如OA办公系统、WMS仓库管理系统、TMS物流管理系统、OMS、SRM、CRM订单管理系统等等。这些业务流程通常非常复杂,如果不通过规范去约束,用我们自己的符号去绘制。恐怕很容易踩坑,并且也不容易形成业务层面的标准和经验积累。那通过BPMN2.0规范,我们可以极大程度的对流程图进行治理、风险把控与合规性检查。
在这里插入图片描述
上图是一个简单的BPMN模型实例,该流程是一个招聘职位的模型。根据我们的观察不难理解其中含义,虽然你可能不知道这个图中每个模块的专业名词,但能看懂理解这个图的流程是什么。所以BPMN在可视化理解方面,还是做的挺不错的,也就是我所推崇的:最好的产品就是没有说明书的产品

三、主要元素

在BMPN2.0中,组件主要分为四类:活动、网关、事件、辅助。这里分享一个业务过程模型和符号规范总结图,便于你快速了解。
在这里插入图片描述

3.1 活动

活动相当于实体,可以说流程图的实体模型定义主要就是由活动组成的。组件如下图所示:
在这里插入图片描述

任务

最常用的活动就是任务了,。为了区分各种类型的任务,通常会在任务组件中,加入图标用以说明:
在这里插入图片描述
组件的颜色、样式及图标并没有统一的规范,在开发的时候可以根据系统的主色调进行适配。只要保持大致的形状即可。
在这里插入图片描述

子流程

但我们的流程过于复杂,就需要对流程图进行抽象。这样可以将细枝末节并相对独立的部分抽取到一个单独的流程里,在总体流程中再进行引入。
在这里插入图片描述

调用活动

一般子流程和任务它们属于流程图的一部分,不能单独使用。然而在多数情况下,一个活动应该在多个流程图中都可以复用。BPMN为此提供了调用活动的构造。当一个全局的活动或子流程被调用时候,用粗边框进行表示。
在这里插入图片描述

事件子流程

与普通流程不同,时间子流程不是序列流触发的。而是由程序执行期间,消息流所触发的事件而设计的流程。
在这里插入图片描述

事务

和数据库里的事务概念一样,一项事务可以全部执行,也可以全部不执行。如果出现问题,则必须回滚事务。
在这里插入图片描述

3.2 网关

网关相当于业务处理组件,活动(实体)只是来说明有什么,网关则可以通过与活动的连线来定义其规则。组件如下图所示:
在这里插入图片描述

排他网关

依序判断执行第一个为Ture的分支,其它分支不判断不执行。
在这里插入图片描述

包容网关

选择或合并一条或多条路径,比如我们选择多个标签来筛选列表。
在这里插入图片描述

并行网关

顾名思义,并行网关是指可以分叉同时并行执行的网关。
在这里插入图片描述

事件网关

上面三种网关是基于数据的独占 (XOR) 网关,但对于正在处理的数据走不同路径我们就需要事件网关。即基于事件的网关,该网关不基于数据进行路由,而是根据接下来发生的事件进行路由。请考虑这样一个业务流:我们订购比萨饼并等待它送达。我们只能在收到披萨后才能吃饭,但是如果 60 分钟后披萨还没有送来怎么办?我们会打一个焦虑的电话,就是这样!我们可以使用事件网关对此进行建模:
在这里插入图片描述

3.3 事件

流程图只能用来描述静态的业务流程,但现实世界是由各种不确定性因素所所叠加的。当执行一个流程时,它将使用并创建数据、信息、文件、文档等。从一个活动到另一个活动的序列流通常伴随着数据传递。而数据的不同会造成不同的事件,我们要像编写程序一样,捕获各种各样的事件,这样才能保证系统的完整性和可靠性。
在这里插入图片描述
在绘图的时候,需要考虑两个方面:事件的原因(触发器),以及事件在流程图中的影响。
最常用的事件是以下三种,其中开始事件和结束事件最关键,也是每个流程图都需要具备的元素,中间事件根据所需添加。需要注意的是,三种事件图标中间会填充的不同符号,用来表达不同的意思。
在这里插入图片描述
事件的类型很多,所以这里用一个实际的例子来观察:
在这里插入图片描述

开始事件

条件事件即条件为真的时候所触发的流程;信号事件指的是全局广播事件的监听;多重事件是指组合了多个事件,只要其中一个事件发生就会被启动;并行多重事件需要所有事件都必须发生才会启动。
在这里插入图片描述

结束事件

默认结束事件就是一个加重的黑圈,里面是空白的;消息事件信封符号会被填充为黑色;终止结束事件则是纯黑色,该事件不仅删除了单个令牌,而是终止了整个流程。
在这里插入图片描述

中间事件

中间事件可以发送和接收信号,通常在以下两种情况下使用中间事件:

  1. 在流程中触发与其他事件相关的事件(例如,发送消息或信号);
  2. 对流程中的事件有所相应(例如,当接收到消息或达到某一时间点)。
    在这里插入图片描述

3.4 辅助

BPMN2.0规范中,最常用的图形就是上述的活动、网关、事件。但为了让复杂的业务更加清晰的表达,BPMN也提出了一些辅助组件的使用。注意:这些辅助组件只是为了更好的表达业务模型,并不是必须的。

泳道图

泳道图如下图所示,可以将不同的业务流拆分成不同的道。他们类似于将游泳池划分为不同得道,游泳比赛的每位参赛者只能在自己道里游泳。
在这里插入图片描述

注释与组

注释主要是为了流程图做一些补充说明,我们可以按照自己喜欢的方式应用注释和组,甚至可以跨越池边界。注释和组不会影响执行语义,因此不要将它们与子流程等混淆。注:可用颜色区分。
在这里插入图片描述

数据存储

流程图在运行时,如想突出其数据流的走向,可以通过数据对象和数据库来表达。
在这里插入图片描述
下图为数据流的例子:
在这里插入图片描述

四、图类型

本节主要介绍面对复杂场景的时候,如何构建清晰的流程模型。

4.1 编排图

当需要多个公司进行交互互作的时候,如多家公司以一种能够完全自动化下达和履行订单以及其他业务事务的方式连接其信息系统,每家公司需要对自己的流程负责。
在这里插入图片描述
上图为一个协作图,但没有办法表达更为详细的表达:消息流中的事件和逻辑顺序。编排图就是为了重点突出消息交换本身,如下图所示:
在这里插入图片描述
编排图分为了三栏,上下两栏分别表示了参与者。例图中:深色为接收方,白色为发起方。

4.2 会话图

会话图概述了某个区域的哪些参与者在哪些任务上进行合作。在下图中,可以看到三个会话。在处理广告订单时,一个客户与一个广告代理商和几个饭计师一起工作。另一方面,客户和广告代理商可以共同开展广告活动。为此,他们与几家媒介合作。设计师还可以是另一家公司的活动的一部分:与出版商一起,设计师处理插图的订单。
在这里插入图片描述

五、技术选型

目前,BPMN2.0应用最广泛的地方就是流程引擎了。人们通过标准所规定的符号,画出全球公认的流程图。然后在自身系统中,进行运行实现复杂的业务逻辑的可视化。下面罗列出实现业务流程需要的前后端技术,可根据自身项目情况进行选型:

5.1 前端

BPMN.JS

BPMN 2.0 渲染工具包和 web 建模器。它是用 JavaScript 编写的,将 BPMN 2.0 图表嵌入在浏览器中, 并独立于后端, 这也使得将其嵌入到任务 Web 应用程序中变得很容易: 可以独立使用也可以集成到你的应用中。

LogicFlow

滴滴开源的,LogicFlow 是一款流程图编辑框架,提供了一系列流程图交互、编辑所必需的功能和简单灵活的节点自定义、插件等拓展机制,方便我们快速在业务系统内满足类流程图的需求。专注于业务自定义的流程图编辑框架,支持实现脑图、ER图、UML、工作流等各种图编辑场景。

AntV X6

阿里开源的,X6 是 AntV 旗下的图编辑引擎。提供简单易用的节点定制能力和开箱即用的交互组件,方便我们快速搭建流程图、DAG 图、ER 图等图应用。

5.2 后台

Activiti

针对商务人员、开发人员和系统管理员的轻量级工作流和业务流程管理 (BPM) 平台。它的核心是用于 Java 的超快速且坚如磐石的 BPMN 2 流程引擎。它是开源的,并在 Apache 许可下分发。 Activiti 可以在任何 Java 应用程序、服务器、集群中部署使用。

Flowable

面向开发人员、系统管理员和业务用户的紧凑且高效的工作流和业务流程管理 (BPM) 平台。Flowable是用Java编写的开源工作流引擎,可以执行BPMN 2.0中描述的业务流程。它是Activiti的一个积极维护的分支。

Compileflow

compileflow是一个非常轻量、高性能、可集成、可扩展的流程引擎。该引擎是淘宝工作流TBBPM引擎之一,是专注于纯内存执行,无状态的流程引擎,通过将流程文件转换生成java代码编译执行,简洁高效。当前是阿里业务中台交易等多个核心系统的流程引擎。compileflow能让开发人员通过流程编辑器设计自己的业务流程,将复杂的业务逻辑可视化,为业务设计人员与开发工程师架起了一座桥梁。

六、总结

最后说点我自己关于BPMN规范的想法:工具也好,规范也罢。都是为了满足我们实际所需的需求,在进行开发实现的时候,我们不要过于死板。要根据实际情况完善、优化和扩充。比如在BPMN规范中,是不允许多个数据流连到一个活动上(多脚针除外),中间需要有网关的角色。但实际开发过程中,发现网关太多以至于影响图形的可视化和可读性的时候,我们就可以通过技术性手段去简化优化相关规范。所以我不建议为了遵守规范而遵守规范,而要根据实际情况适当调整,方可开发出更有实际意义的产品。

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

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

相关文章

大数据ETL开发之图解Kettle工具

详细笔记参考&#xff1a;https://blog.csdn.net/yuan2019035055/article/details/120409547以下只是简单记录一下我学习过程中的心得3.1.5 JSON输入JSONPath 类似于 XPath 在 xml 文档中的定位&#xff0c;JsonPath 表达式通常是用来路径检索或设置Json的。其表达式可以接受“…

阶段二11_面向对象高级_学生管理系统案例2

主要内容&#xff1a; 添加学生 static关键字一.添加学生时判断id是否存在 0.思路图片&#xff1a; 04/图片/2_添加学生判断id存在的问题分析.png 1.思路实现详细步骤&#xff1a; StudentController【客服接待】 /** 接收到学生id后&#xff0c;判断该id在数组中是否存在 这…

SRS源码分析-SDP内容解析

前言 在学习SRS的RTC模块之前&#xff0c;首先来分析下SRS在将rtmp推流转成rtc流&#xff0c;通过浏览器拉取webrtc流场景下产生的SDP内容 SDP格式介绍 SDP数据是文本格式&#xff0c;由多个 <key><value> 表达式构成&#xff0c;<key>的值只能是一个字符…

第二讲:ambari编译复盘,如何实现一次性成功编译ambari

上节课我们已经讲解了如何成功编译ambari源码,安装ambari-server rpm包以及成功部署ambari。本节课我们来复盘一下上节课的编译过程,以及思考如何实现一次性成功编译ambari。 要想一次性成功编译ambari,那么就需要将预置工作做好,比如: maven镜像源配置,node_moudle模块…

Go项目(商品微服务-2)

文章目录简介handler商品分类轮播图品牌和品牌与分类oss前端直传库存服务数据不一致redis 分布式锁小结简介 开发商品微服务 API 层类似的&#xff0c;将 user-web 目拷贝一份&#xff0c;全局替换掉 user-web修改 config 去掉不用的配置更新本地和远程 nacos 配置文件 把 pro…

OpenGL环境配置

方法一&#xff1a;1.下载GLFW点击GLFW跳转2.下载后解压3.下载glad&#xff0c;解压后4.用vs2019新建Cmake项目5.在新建的Cmake项目下建立depend文件夹在depend里放置我们下载解压的glad和glfw-3.3.8.bin.WIN646.项目中可以看到我们加进来的文件7.编写我们项目的CMakeLists.txt…

Condition 源码解读

一、Condition 在并发情况下进行线程间的协调&#xff0c;如果是使用的 synchronized 锁&#xff0c;我们可以使用 wait/notify 进行唤醒&#xff0c;如果是使用的 Lock 锁的方式&#xff0c;则可以使用 Condition 进行针对性的阻塞和唤醒&#xff0c;相较于 wait/notify 使用…

路径规划-人工势场法

一.基本思想 目标点对机器人产生吸引力&#xff0c;障碍物对机器人产生排斥力&#xff1b; 所有力的合成构成机器人的控制律 二. 主要步骤 1.构建人工势场 目标点&#xff1a;吸引势场 障碍物&#xff1a;排斥势场 2.根据人工势场计算力 对势场求偏导 3.计算合力 计…

bpftrace 笔记

bpftrace -e BEFIN {printf("hello world!\n");}获取调用 vfs_read 函数的进程id, 每2s打印一次 bpftrace -e kprobe:vfs_read {ID pid;} interval:s:2 {printf{"ID:%d\n", ID);}用户态调试 bpftrace -e uprobe:/*/a.out:and {printf("ID:%d\n&qu…

费解的开关/翻硬币

&#x1f331;博客主页&#xff1a;大寄一场. &#x1f331;系列专栏&#xff1a; 算法 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 题目&#xff1a;费解的开关 你玩过“拉灯”游戏吗&#xff1f; 25盏灯排成一个 55 的方形。 每一个灯都有一个开关&…

看完这篇入门性能测试

大家好&#xff0c;我是洋子。最近组内在进行服务端高并发接口的性能压测工作&#xff0c;起因是2023年2月2日&#xff0c;针对胡某宇事件进行新闻发布会直播&#xff0c;几十万人同时进入某媒体直播间&#xff0c;造成流量激增 从监控上可以看出&#xff0c;QPS到达某峰值后&…

brew安装问题

最近使用mac安装了Python和PyCharm&#xff0c;使用python中的绘制图像的turtle库后&#xff0c;执行报错&#xff1a; import _tkinter # If this fails your Python may not be configured for Tk ModuleNotFoundError: No module named _tkinter 查询后需在mac 命令行执行&…

【网络监控】Zabbix详细安装部署(最全)

文章目录Zabbix详细安装部署环境准备安装依赖组件访问初始化配置Zabbix详细安装部署 Zabbix 是一个高度集成的网络监控解决方案&#xff0c;可以提供企业级的开源分布式监控解决方案&#xff0c;由一个国外的团队持续维护更新&#xff0c;软件可以自由下载使用&#xff0c;运作…

【前端必看】极大提高开发效率的网页 JS 调试技巧

大家好&#xff0c;我是前端西瓜哥。本文讲解如何使用浏览器提供的工具进行 JS 代码的断点调试。 debugger 在代码中需要打断点的地方&#xff0c;加上 debugger&#xff0c;表示一个断点。浏览器代码执行到该位置时&#xff0c;会停下来&#xff0c;进入调试模式。 示例代码…

java内存模型的理解

java内存模型的理解并发问题产生的源头缓存导致的可见性问题线程切换导致的原子性问题编译优化带来的有序性问题小结Java内存模型: 解决可见性和有序性问题Java内存模型与JVM内存模型的区别volatile关键字Happens-Before规则小结思考题参考并发问题产生的源头 缓存导致的可见性…

【Verilog】——Verilog简介

目录 1.简介 2.什么是HDL以及HDL的功能 3.Verilog和C语言的比较 4.Verilog的用途 5.数字系统的抽象层次 1.系统级 2.算法级 3.RTL级&#xff08;寄存器变换级&#xff09; 6.数字系统抽象层级 7.自顶向下的结构化设计方法 8.Verilog建模 9.Verilog概述 10.Verilog模块的基本…

Django学习17 -- ManytoManyField

1. ManyToManyField &#xff08;参考&#xff1a;Django Documentation Release 4.1.4&#xff09; 类定义 class ManyToManyField(to, **options)使用说明 A many-to-many relationship. Requires a positional argument: the class to which the model is related, which w…

推导部分和——带权并查集

题解&#xff1a; 带权并查集 引言&#xff1a; 带权并查集是一种进阶的并查集&#xff0c;通常&#xff0c;结点i的权值等于结点i到根节点的距离&#xff0c;对于带权并查集&#xff0c;有两种操作需要掌握——Merge与Find&#xff0c;涉及到路径压缩与维护权值等技巧。 带…

用Python批量重命名文件

案例 今天,我们来整理文件夹中的文件,给某个文件夹下的所有文件重新命名。要求是给所有文件按照修改时间,按顺序在文件名前面加上编号。比如将文件资料.xlsx重命名为1. 资料.xlsx import osdef Get_modify_time(file):return os.path.getmtime(file) #获取文件修改时间path…

vue3的v-model指令

1. 普通input输入框双向绑定 <template><!-- 1. 普通input输入框双向绑定 --><!-- 其实等价于&#xff1a;<input :modelValue"title" update:modelValue"newTitle>titlenewTitle"/> --><input type"text" v-mod…