(一)工作流系列——什么是工作流?
什么是流程引擎?
顾名思义,是支持流程编排,流程执行的引擎底座。在低代码平台、办公自动化(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)
-
事件用圆圈表示,代表发生的事情,与活动(代表要做的事情)相区分。圆圈内的图标表示事件类型,如信封代表消息,时钟代表时间。
-
事件分为捕获型(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>
-
按所处环节分类
-
起始事件:作为流程触发点,有单一边框,只能是捕获型,用开放图标表示。
-
中间事件:发生在起始事件和结束事件之间,有双边框,可以是捕获型或抛出型,分别用开放或实心图标表示。例如,一个任务可以流向一个抛出消息的事件,然后在另一个池中,后续事件等待捕获响应后继续流程。
-
结束事件:代表流程的结果,有单一边框且较粗或为粗体,只能是抛出型,用实心图标表示。
-
二、活动(Activity)
-
任务(原子任务):代表不能进一步细分的单个工作单元,称为原子活动,是流程图表中所示的最低级别活动。一组任务可以代表高级程序。
-
子流程:用于隐藏或显示额外的业务流程细节。折叠时,子流程由矩形底部的加号表示;展开时,圆角矩形扩展以显示所有流对象、连接对象和工件。子流程被称为复合活动,有自己独立的起始和结束事件,父流程的序列流不能跨越边界。
-
Choreography Task(编排任务)
- 在一个任务节点中可以编排流程。但实际上主流的流程引擎都没有实现这个功能,因为可以通过嵌套子流程或者关联不同的主流程来实现。
三、网关(Gateway)
-
排他网关(XOR)
-
并行网关(AND)
-
包容网关(OR)
开源流程引擎选型
Jbpm4、activiti、flowable、camunda,smartEngine。其中:Jbpm4、Activiti、Flowable、camunda四个框架同宗同源,都衍生自Jbpm4。
- Activiti
activiti6以及activiti5的代码官方已经暂停维护了,最新版本是7.0,但只是在6.0的内核基础上进行了一些应用层的封装。(6.0的一些bug可能还没修复)
- Flowable
flowable基于activiti6衍生出来的版本,flowable目前最新版本是v6.6.0,开发团队是从activiti中分裂出来的,修复了一众activiti6的bug,并在其基础上研发了DMN支持,BPEL支持等等,相对开源版,其商业版的功能会更强大。以flowable6.4.1版本为分水岭,大力发展其商业版产品,开源版本维护不及时,部分功能已经不再开源版发布,比如表单生成器(表单引擎)、历史数据同步至其他数据源、ES等。(流程量过大的时候需要处理历史数据归档的问题)
- Camunda
Camunda基于activiti5,所以其保留了PVM,最新版本Camunda7.15,保持每年发布2个小版本的节奏,开发团队也是从activiti中分裂出来的,发展轨迹与flowable相似,同时也提供了商业版,不过对于一般企业应用,开源版本也足够了,强烈推荐camunda流程引擎,功能和性能表现稳定。
选择camunda的理由:
1)通过压力测试验证Camunda BPMN引擎性能和稳定性更好。
2)功能比较完善,除了BPMN,Camunda还支持企业和社区版本中的CMMN(案例管理)和DMN(决策自动化)。Camunda不仅带有引擎,还带有非常强大的工具,用于建模,任务管理,操作监控和用户管理,所有这些都是开源的。
性能测试
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异步通讯 | – |