記錄一下,公司平臺升級,工作流引擎由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遷移即可。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章