记录一下,公司平台升级,工作流引擎由activity5.2升级到flowable6.4.2(springboot整合flowable)

 

前言

目前工作流是基于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的驳回/退回/收回功能操作代码实现以及提升其性能和稳定性。

如何升级

  1. 工作流引擎框架升级,由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接口重命名为UserEntityManagerGroupIdentityManager接口重命名为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迁移即可。

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值