工作流引擎的架构设计与对比

所谓工作流引擎是指 workflow 作为应用系统的一部分,并为之提供对各应用系统有决定作用的,根据角色、分工和条件的不同决定信息传递路由、内容等级 等核心解决方案。工作流引擎可以灵活地配置工作流程,并且可以自动化的根据配置进行状态变更和流程流转,包括流程的节点管理、流向管理、流程样例管理等重要功能。下面,介绍一个比较简单的工作流程,来演示一下工作流引擎到底是一个什么样的东西。

最简单流程

最简单的一个流程工单,申请人发起流程,每个节点审批人逐个审批,最终流程结束。

会签

在这个过程中,节点分成了两大类:简单节点和复杂节点。

简单节点处理逻辑不变,依然是处理完之后自动到下一个节点。

复杂节点比如说会签节点,则不同,需要其下的所有子节点都处理完成,才能到下一个节点。

并行

同样属于复杂节点,其任何一个子节点处理完成后,都可以进入到下一个节点。

条件判断

需要根据不同的表单内容进入不同的分支流程。

举一个例子,比如在进行休假申请时,请假一天需要直属领导审批,如果大于三天则需要部门领导审批。

动态审批人

审批节点的审批人需要动态获取,并且可配置。

审批人的获取方式可以分以下几种:

  1. 固定审批人

  2. 从申请表单中获取

  3. 根据组织架构,动态获取

  4. 从配置的角色组或者权限组中获取

撤销和驳回

节点状态变更可以有申请人撤回,审批人同意,审批人驳回等。那么在驳回时,可以直接驳回到开始节点,流程结束,也可以驳回到上一个节点。更复杂一些,甚至可以驳回到前面流程的任意一个节点。

以上便是简单工作流中的一些比较常见的需求点,还有像加签,代理,脚本执行等功能,如果都实现的话,应该会是一个庞大的工作量。这时,我们就需要用到一个开源的工作流引擎,来实现这些常用但开发起来却比较繁琐的流程功能。

目前,市场上比较有名的开源流程引擎有 Osworkflow、Jbpm、Activiti、Flowable、Camunda 等。其中:Jbpm、Activiti、Flowable、Camunda 四个框架同宗同源,祖先都是 Jbpm4,开发者只要用过其中一个框架,基本上就会用其它三个了。下面,我们就来了解下这些工作流引擎的一些特性和异同点。

工作流引擎对比

Osworkflow

Osworkflow 是一个轻量化的流程引擎,基于状态机机制,数据库表很少。Osworkflow 提供的工作流构成元素有:步骤(step)、条件(conditions)、循环(loops)、分支(spilts)、合并(joins)等,但不支持会签、跳转、退回、加签等这些操作,需要自己扩展开发,有一定难度。如果流程比较简单,Osworkflow 是一个很不错的选择。

Activiti

Activiti 由 Alfresco 软件开发,Activiti 的版本比较复杂,有 Activiti5、Activiti6、Activiti7 几个主流版本。Activiti5 和 Activiti6 的核心 leader 是 Tijs Rademakers,由于团队内部分歧,在 2017 年 Tijs Rademakers 离开团队,创建了后来的 Flowable。Activiti6 以及 Activiti5 代码已经交接给了 Salaboy 团队,Activiti6 以及 Activiti5 的代码官方已经暂停维护了。

Salaboy 团队目前在开发 Activiti7 框架,Activiti7 内核使用的还是 Activiti6,并没有为引擎注入更多的新特性,只是在 Activiti 之外的上层封装了一些应用。

Flowable

Flowable 是一个使用 Java 编写的轻量级业务流程引擎,使用 Apache V2 license 协议开源。2016 年 10 月,Activiti 工作流引擎的主要开发者离开 Alfresco 公司并在 Activiti 分支基础上开启了 Flowable 开源项目。基于 Activiti v6 beta4 发布的第一个 Flowable release 版本为 6.0。

Flowable 项目中包括 BPMN引擎、CMMN引擎、DMN引擎、表单引擎等模块。相对开源版,其商业版的功能会更强大。以 Flowable6.4.1 版本为分水岭,大力发展其商业版产品,开源版本维护不及时,部分功能已经不再开源版发布,比如表单生成器、历史数据同步至其他数据源、ES 等。

Camunda

Camunda 基于 Activiti5,所以其保留了 PVM,开发团队也是从 Activiti 中分裂出来的,发展轨迹与 Flowable 相似,同时也提供了商业版,不过对于一般企业应用,开源版本也足够了。

以上便是工作流引擎的一个大致设计思路,运用一些开源的工作流引擎,可以让我们的开发设计达到事半功倍的效果,更多详情了解可以看工作流引擎设计与应用icon-default.png?t=N7T8https://www.jnpfsoft.com/?csdnjie

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud源码探析(十二)-基于SpringBoot开发自定义中间件

1.概述 中间件是一种介于操作系统和应用软件之间,为应用软件提供服务功能的软件,按功能划分有消息中间件(Kafka、RocketMQ)、通信中间件(RPC通信中间件,dubbo等),应用服务器等。中间…

MyBatis进行CRUD中添加数据实现主键回填

文章目录 MyBatis进行CRUD中添加数据实现主键回填1、创建一个mybatis项目2、实现添加数据时主键回填在MyBatisTest.java中添加下面方法在UserMapper.java中添加对应的属性在UserMapper.xml中添加sql语句如下运行结果如下(取消commit方法注释后就不会出现Rolling back回滚进行真…

海外问卷使用动态ip和静态ip有哪些优缺点?

使用动态IP的优点包括: 1、高度匿名性:通过动态切换IP地址来隐藏用户的真实身份,提供更高的匿名性,确保数据的安全。 2、成本效益:相对于静态IP而言,动态IP的获取和使用成本更低,对于短期或小规…

牛客BC115 超级圣诞树

万众瞩目 在上一篇我们介绍了一个圣诞树的打印,而这道题与上次不同的是他的基本单位是一直在变的 我建议先把上一个搞懂在写这道题这个。 牛客网BC114 圣诞树-CSDN博客 ok那么正文开始 题目如下 今天是圣诞节,牛牛要打印一个漂亮的圣诞树送给想象中…

字符串逆序输出

逆序输出就是本来abc输出的,然后我想让他输出成cba,那么我们还是要用到for循环,只不过原先是从零开始往上加,这回呢,是从上面往下减 我们观察上面这个图片,我们想要输出olleh,那么我们就要从4开…

甘草书店:#12 2023年12月18日 星期一 晴 创业分享:「甘草书店之于甘草创投的意义」

尽管甘草书店的初衷简单而纯粹,就是在做很多书店人都在做的“书店”,只不过我这里加的是创业投资。但社会和市场更喜欢从反方向提问:你做创投就做创投,为什么要开家书店? 对于我个人,当然有一套自我说服的…

[PyTorch][chapter 8][李宏毅深度学习][Back propagation]

前言: 反向传播算法(英:Backpropagation algorithm,简称:BP算法)是一种监督学习算法,常被用来训练多层感知机。 它用于计算梯度计算中,降低误差。 目录: 链式法则 模型简介(Model) 损失函…

Java实现限流算法

下面是一个使用Java实现的令牌桶算法的例子: import java.util.concurrent.atomic.AtomicLong;public class RateLimiter {private final long capacity; // 令牌桶容量private final long rate; // 令牌生成速率private AtomicLong tokens; // 当前令牌数量privat…

RAII智能指针

RAII resource acquisition is initialization RAII是利用对象声明周期来控制程序资源的简单技术 在对象构造时获取资源,控制着对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此,我们实际上把管理一份资源…

2024Web自动化测试的技术框架和工具有哪些?

Web 自动化测试是一种自动化测试方式,旨在模拟人工操作对 Web 应用程序进行测试。这种测试方式可以提高测试效率和测试精度,减少人工测试的工作量和测试成本。在 Web 自动化测试中,技术框架和工具起着至关重要的作用。本文将介绍几种常见的 W…

VM安装Sonoma【笔记】

VMware Workstation安装MacOS Sonoma 1、配置虚拟机,根据系统性能调整参数; 2、先不焦急启动虚拟机,打开虚拟机存储目录,以文本方式打开.vmx文件(这里以Sonoma.vmx为例); 这里只针对Inter CP…

vue-springboot二手图书商城交易系统ij5dr

本系统依赖于MySQL数据库来储存信息,系统完成后,所有需要的数据都要从数据库中读取,这也意味着无论是插入、更新还是删除操作,只要对数据有改动的操作都需要与数据库交互,因此,系统的全部数据都要储存在数据…