前言
目前工作流是基于Acitiviti 5.20进行扩展和封装集成的,工作流引擎框架相对来说比较老旧,尽管Acitiviti现在已经出到了6.0版本,但是对比5.20新特性并不多,变化不大,开发团队也停止了维护,所以来说升级意义不大。综合目前市面上工作流引擎框架和项目支撑的需要考虑,准备对ibase2.0的工作流引擎进行重构升级,在兼容原有项目数据的情况下,决定采用Flowable 6.4.2来进行无缝升级。Flowable是Acitivity原开发团队基于Acitivity 5.22迁出的分支重构发布,目前已经修复了Acitiviti6很多的bug,并且新增很多Acitiviti6没有的新特性和功能,也可以实现零成本从Activiti迁移到Flowable。
升级带来的好处
ibase2.0从Activiti 5.20升级到Flowable 6.4.2,会对工作流引擎性能和稳定性、并发性带来明显的提升,更加的稳定实用。Flowable 6.4.2已经修复了Activiti5/6的很多bug,也新增了很多Activiti5/6没有的特性,例如已经支持加签、动态增加实例中的节点、支持cmmn、dmn规范等。
1、flowable已经支持所有的历史数据使用mongdb存储,activiti没有。
2、flowable支持事务子流程,activiti没有。
3、flowable支持多实例加签、减签,activiti没有。
4、flowable支持httpTask等新的类型节点,activiti没有。
5、flowable支持在流程中动态添加任务节点,activiti没有。
6、flowable支持历史任务数据通过消息中间件发送,activiti没有。
7、flowable支持java11,activiti没有。
8、flowable支持动态脚本,,activiti没有。
9、flowable支持条件表达式中自定义juel函数,activiti没有。
10、flowable支持cmmn规范,activiti没有。
11、flowable修复了dmn规范设计器,activit用的dmn设计器还是旧的框架,bug太多。
12、flowable屏蔽了pvm,activiti6也屏蔽了pvm(因为6版本官方提供了加签功能,发现pvm设计的过于臃肿,索性直接移除,这样加签实现起来更简洁、事实确实如此,如果需要获取节点、连线等信息可以使用bpmnmodel替代)。
13、flowable与activiti提供了新的事务监听器,并且提高对事件监听器事务生命周期的支持。activiti5版本只有事件监听器、任务监听器、执行监听器。
14、flowable对activiti的代码大量的进行了重构。
15、activiti以及flowable支持的数据库有h2、hsql、mysql、oracle、postgres、mssql、db2。其他数据库不支持的。使用国产数据库的可能有点失望了,需要修改源码了。
16、flowable支持jms、rabbitmq、mongodb方式处理历史数据,activiti没有。
17、flowable支持回退功能,运行通过API方式,让工作流当前状态回滚到之前的状态,即驳回/退回上一步/退回到(历史某一个节点)。
18、flowable支持异步处理历史数据。当前版本处理历史数据与运行时数据处在同一个线程,大量使用案例表明,处理历史数据占用较长时间而用户不得不等待该线程事务的结束。改为异步处理后性能明显得到改善。
19、flowable增加和拓展对事件子流程的支持。
由上面示例的新特性来看,对Activiti 5.20升级是带来明显的变化和意义的,特别是第14点对原有Activiti代码的大量重构优化,一定程度上优化了引擎,第17点对回退功能即驳回/退回上一步/退回到(历史某一个节点)的支持,无需自己物理的画流程线实现,一定程度上简化了ibase2.0的驳回/退回/收回功能操作代码实现以及提升其性能和稳定性。
如何升级
- 工作流引擎框架升级,由Activiti 5.20升级到Flowable 6.4.2,首先需要修改Maven的依赖包,由activity的依赖改为flowable,版本号也由5.20.0到6.4.2,由于整合了springboot框架,我们依赖引入springboot和flowable的整合包即可:
<!-- activiti 包,工作流核心包 -->
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter-basic</artifactId>
<version>6.4.2</version>
</dependency>
,我们要兼容以前旧版本的工作流数据,还要引入flowable提供的V5微型工作流引擎来配合兼容,依赖引入包即可:
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable5-spring-compatibility</artifactId>
<version>6.4.2</version>
</dependency>
,同时要在工作流引擎配置属性flowable5CompatibilityEnabled为true,以及配置V5微型引擎工厂类bean:org.flowable.compatibility.spring.SpringFlowable5CompatibilityHandlerFactory。接着就是对代码上的一些调整,包括包名和方法名的改动,其中有:
1)所有org.activiti包都已重命名为org.flowable。
2)所有类名中包含的"Activiti"都已重命名,替换为Flowable。 例如ActivitiException重命名为FlowableException。
3)以前在org.activiti.engine.impl.pvm包(及其子包)下的所有类都已移除。这是因为PVM (流程虚拟机 Process Virtual Machine)模型已被替换为一个更简单更轻量的模型。这里需要对这些不再被支持的代码进行代替性重构。
4)所有的实体管理器接口都扩展了org.flowable.engine.impl.persistence.entity.EntityManager泛型接口。所有的实现类都实现了AbstractEntityManager泛型接口。同时,为了保证一致性:UserIdentityManager接口重命名为UserEntityManager,GroupIdentityManager接口重命名为GroupEntityManager。
2.数据库升级。在升级前,确保已经(使用数据库的备份功能)备份了数据库。要进行升级,框架首先需要:
1)确认工作流引擎框架的核心配置文件数据库属性设置,其中需要设置 databaseSchemaUpdate为true,databaseSchemaUpdate属性:工作流引擎启动和关闭 的使用数据库的针对表结构的处理策略。 默认为false:在工作流引擎启动时检查数据库 脚本的版本和activiti library的版本是否一致如果不一致抛出异常信息。true:在脚本结构 发生变化时候,检查表结构是否存在,如果存在则更新,如果不存在则创建。create-drop: 当工作流引擎被创建时候创建,当工作流引擎关闭时删除表结构信息。
2)启动一个新版本的Flowable项目,并将它指向包含旧版本数据的数据库。确认上面配置已将databaseSchemaUpdate设置为true。当Flowable发现库与数据库表结构不同步时,会自动将数据库表结构升级至新版本。
升级前后数据库表对比:
升级前:
升级后:
3)启动后或存在无法创建重复列等启动异常的情况,则需要检查一下工作流引擎的数据库版本是否已经升级为6.5.1,
,
否则需要手动初始化新的工作流引擎数据库版本信息,执行以下脚本即可:
create table act_ge_property_bak1 as select * from act_ge_property;
delete from act_ge_property;
INSERT INTO act_ge_property VALUES ('cfg.execution-related-entities-count', 'true', 1);
INSERT INTO act_ge_property VALUES ('cfg.task-related-entities-count', 'true', 1);
INSERT INTO act_ge_property VALUES ('common.schema.version', '6.5.0.1', 1);
INSERT INTO act_ge_property VALUES ('entitylink.schema.version', '6.5.0.1', 1);
INSERT INTO act_ge_property VALUES ('eventsubscription.schema.version', '6.5.0.1', 1);
INSERT INTO act_ge_property VALUES ('identitylink.schema.version', '6.5.0.1', 1);
INSERT INTO act_ge_property VALUES ('job.schema.version', '6.5.0.1', 1);
INSERT INTO act_ge_property VALUES ('next.dbid', '1', 1);
INSERT INTO act_ge_property VALUES ('schema.history', 'upgrade(5.20.0.2->6.5.0.1)', 2);
INSERT INTO act_ge_property VALUES ('schema.version', '6.5.0.1', 2);
INSERT INTO act_ge_property VALUES ('task.schema.version', '6.5.0.1', 1);
INSERT INTO act_ge_property VALUES ('variable.schema.version', '6.5.0.1', 1);
4)集成使用流程设计器flowable-ui-modeler,还需要从 act_re_model 表复制到 act_de_model表,执行以下sql:
INSERT INTO act_de_model(id,NAME,model_key,last_updated,created,VERSION,tenant_id,model_type,model_editor_json,created_by,last_updated_by) SELECT id_ AS id,name_ AS NAME,key_ AS model_key,LAST_UPDATE_TIME_ AS last_updated,CREATE_TIME_ AS created,VERSION_ AS VERSION,TENANT_ID_ AS tenant_id,0 AS model_type,META_INFO_ AS model_editor_json, 'admin' as created_by,'admin' as last_updated_by FROM act_re_model;
上面sql没有把act_ge_bytearray的草稿json数据复制到act_de_model 的model_editor_json,字段,执行一下代码:
http://localhost:8080/flowengine/design/syncModel
集成Flowable新版流程设计器flowable-ui-modeler来创建和部署发布流程,就会存在一个问题,flowable-ui-modeler并没有使用原来的act_re_model模型表,而是使用act_de_model表来存储模型数据,所以若是集成使用了flowable-ui-modeler流程设计器完成流程的创建和设计发布,我们还得对模型数据进行迁移,执行面的sql迁移即可。