(一)工作流系列——什么是工作流?

什么是流程引擎?

顾名思义,是支持流程编排,流程执行的引擎底座。在低代码平台、办公自动化(OA)、BPM平台、工作流系统均需要流程引擎功能。其解决的问题主要为复杂流程中状态的灵活管理以及可编排性。

BPMN(流程模型定义规范)

目前流程定义模型主要遵循BPMN规范,BPMN 最初由业务流程管理倡议组织(BPMI)开发。自 2005 年这两个组织合并后,BPMN 一直由对象管理组织(OMG)维护。BPMN 的 2.0 版本于 2011 年 1 月发布,此时名称被修订为业务流程模型和符号(Business Process Model and Notation),以反映引入了执行语义,这些执行语义与现有的符号和图表元素一起被引入。尽管它是 OMG 的规范,但 BPMN 也被批准为 ISO 19510。最新版本是 BPMN 2.0.2,于 2014 年 1 月发布。(来自wiki)

PVM(流程引擎执行)

另外流程引擎的主流执行模型目前遵循PVM的较多,PVM主要讨论的是如何定义流程的执行过程(Activiti and Transition),而不是关注流程模型的定义。(Activiti6移除了PVM,所以Flowable也不支持PVM)

public class PvmExecution {
    private PvmActivity currentActivity;
    private List<PvmTransition> transitions;
    
    public void execute() {
        // 执行当前活动
        currentActivity.execute(this);
        
        // 确定下一个活动
        PvmTransition transition = findNextTransition();
        if (transition != null) {
            take(transition);
        }
    }
}

public class PvmCharacteristics {
    // 1. 抽象执行模型
    class ProcessInstance {
        private PvmProcessDefinition processDefinition;
        private Map<String, Object> variables;
        private PvmExecution rootExecution;
    }
    
    // 2. 状态管理
    class ExecutionImpl implements PvmExecution {
        private PvmActivity activity;
        private ExecutionImpl parent;
        private List<ExecutionImpl> executions;
        private boolean isActive;
    }
    
    // 3. 行为委托
    interface ActivityBehavior {
        void execute(ActivityExecution execution);
    }
}

一个典型的流程生命周期

基本元素

一、事件(Event)

  1. 事件用圆圈表示,代表发生的事情,与活动(代表要做的事情)相区分。圆圈内的图标表示事件类型,如信封代表消息,时钟代表时间。

  2. 事件分为捕获型(Catching)和抛出型(Throwing)。

捕获型

<!-- 抛出型信号事件:发送信号 -->
<intermediateThrowEvent id="sendAlert">
    <signalEventDefinition signalRef="systemAlert"/>
</intermediateThrowEvent>

抛出型

<!-- 捕获型消息事件:等待消息到达 -->
<intermediateCatchEvent id="waitForPayment">
    <messageEventDefinition messageRef="paymentMessage"/>
</intermediateCatchEvent>


<!-- 流程A:抛出事件 -->
<process id="processA">
    <!-- 抛出消息 -->
    <intermediateThrowEvent id="sendNotification">
        <messageEventDefinition messageRef="notificationMessage"/>
    </intermediateThrowEvent>
</process>

<!-- 流程B:捕获事件 -->
<process id="processB">
    <!-- 等待接收消息 -->
    <intermediateCatchEvent id="waitForNotification">
        <messageEventDefinition messageRef="notificationMessage"/>
    </intermediateCatchEvent>
</process>
  1. 按所处环节分类

    1. 起始事件:作为流程触发点,有单一边框,只能是捕获型,用开放图标表示。

    2. 中间事件:发生在起始事件和结束事件之间,有双边框,可以是捕获型或抛出型,分别用开放或实心图标表示。例如,一个任务可以流向一个抛出消息的事件,然后在另一个池中,后续事件等待捕获响应后继续流程。

    3. 结束事件:代表流程的结果,有单一边框且较粗或为粗体,只能是抛出型,用实心图标表示。

二、活动(Activity)

  1. 任务(原子任务):代表不能进一步细分的单个工作单元,称为原子活动,是流程图表中所示的最低级别活动。一组任务可以代表高级程序。

  2. 子流程:用于隐藏或显示额外的业务流程细节。折叠时,子流程由矩形底部的加号表示;展开时,圆角矩形扩展以显示所有流对象、连接对象和工件。子流程被称为复合活动,有自己独立的起始和结束事件,父流程的序列流不能跨越边界。

  3. Choreography Task(编排任务)

    1. 在一个任务节点中可以编排流程。但实际上主流的流程引擎都没有实现这个功能,因为可以通过嵌套子流程或者关联不同的主流程来实现。

三、网关(Gateway)

  1. 排他网关(XOR)

  2. 并行网关(AND)

  3. 包容网关(OR)

开源流程引擎选型

Jbpm4、activiti、flowable、camunda,smartEngine。其中:Jbpm4、Activiti、Flowable、camunda四个框架同宗同源,都衍生自Jbpm4。

  1. Activiti

activiti6以及activiti5的代码官方已经暂停维护了,最新版本是7.0,但只是在6.0的内核基础上进行了一些应用层的封装。(6.0的一些bug可能还没修复)

https://www.activiti.org/

  1. Flowable

flowable基于activiti6衍生出来的版本,flowable目前最新版本是v6.6.0,开发团队是从activiti中分裂出来的,修复了一众activiti6的bug,并在其基础上研发了DMN支持,BPEL支持等等,相对开源版,其商业版的功能会更强大。以flowable6.4.1版本为分水岭,大力发展其商业版产品,开源版本维护不及时,部分功能已经不再开源版发布,比如表单生成器(表单引擎)、历史数据同步至其他数据源、ES等。(流程量过大的时候需要处理历史数据归档的问题)

https://flowable.com/open-source/

  1. Camunda

Camunda基于activiti5,所以其保留了PVM,最新版本Camunda7.15,保持每年发布2个小版本的节奏,开发团队也是从activiti中分裂出来的,发展轨迹与flowable相似,同时也提供了商业版,不过对于一般企业应用,开源版本也足够了,强烈推荐camunda流程引擎,功能和性能表现稳定。

选择camunda的理由:

1)通过压力测试验证Camunda BPMN引擎性能和稳定性更好。

2)功能比较完善,除了BPMN,Camunda还支持企业和社区版本中的CMMN(案例管理)和DMN(决策自动化)。Camunda不仅带有引擎,还带有非常强大的工具,用于建模,任务管理,操作监控和用户管理,所有这些都是开源的。

https://docs.camunda.org/manual/7.15/introduction/

性能测试

https://lowcode.blog.csdn.net/article/details/109030329

结论上来看Camunda > Flowable

功能对比

td {white-space:nowrap;border:1px solid #dee0e3;font-size:10pt;font-style:normal;font-weight:normal;vertical-align:middle;word-break:normal;word-wrap:normal;}
Activiti 7 Flowable 6 Camunda bpm JBPM 7 JFLOW(国产的)
功能
会签
回退 ×
驳回 ×
自定义流转 × ×
加签、减签 ×
多实例
事务子流程
版本迁移 × × × ×
兼容性及二次开发
支持的流程格式 BPMN2.0、XPDL、PDL BPMN2.0、XPDL、XPDL BPMN2.0、XPDL、XPDL BPMN2.0 BPMN2.0
开源情况 开源 提供商业和开源版 提供商业和开源版 开源 开源
开发基础 jBPM4 Activiti 5 & 6 Activiti 5 版本5之后Drools Flow 自开发
直接支持的脚本 JUEL、groovy JUEL、groovy python、ruby、groovy、JUEL
引擎核心(跟代码兼容有关) 去除PVM 去除PVM 流程虚拟机(PVM)(迁移上有优势) Drools 自研
Spring结合
二次开发难度 一般 一般 一般 较难 一般
未来拓展
CMMN支持 × × ×
DMN支持 √(6.4之前不稳定) ×
历史数据处理(NoSql) × √(只提供了解决方案) ×
支持数据库 Oracle、SQL Server、MySQL Oracle、SQL Server、MySQL、postgre Oracle、SQL Server、MySQL、postgre Mysql,postgre oracle,sqlserver,mysql
集群部署 √(6.5版本支持)
云部署
其他特性
持久化框架 Mybatis JPA二次封装 Hibernate JPA
架构 spring boot 2 spring boot 1.5 spring boot 2 Kie spring boot 2(特别版本)
事务管理 MyBatis机制/Spring事务控制 hibernate机制/Spring事务控制 hibernate机制/Spring事务控制 Bitronix,基于JTA事务管理
分布式事务 MyBatis机制/Spring事务控制 补偿机制,SAGA 模式 Bitronix,基于JTA事务管理
开发手册 https://activiti.gitbook.io/activiti-7-developers-guide/部分网页打不开 http://www.shareniu.com/flowable6.5_zh_document/bpm/index.html https://docs.camunda.org/manual/7.13/user-guide/ https://docs.jboss.org/jbpm/release/7.40.0.Final/jbpm-docs/html_single/ http://ccbpm.mydoc.io/
运行模式 独立运行和内嵌 独立运行和内嵌 独立运行和内嵌
源码活跃度 相对活跃 相对活跃 比较活跃 相对活跃 一般
源码地址 https://github.com/Activiti/Activiti https://github.com/flowable/flowable-engine https://github.com/camunda/camunda-bpm-platform https://github.com/kiegroup/jbpm https://gitee.com/opencc/JFlow
设计器 集成idea eclipse,web 自提供,eclipse 自提供,eclipse Eclipse 自提供,.net开发
集成接口 SOAP、Mule、RESTful SOAP、Mule、RESTful SOAP、Mule、RESTful 消息通讯 SOAP、Mule、RESTful
内部服务通讯 Service间通过API调用 Service间通过API调用 Service间通过API调用 基于Apache Mina异步通讯

参考文档

流程引擎Activti原理

开源流程引擎选型

Activiti Github

BPMN Wiki

posted @ 2024-12-21 14:16  XinStar  阅读(28)  评论(0编辑  收藏  举报