目錄
- 前言
- flowable6.4.2 不足之處
- 并行網關跳轉駁回BUG
- 多執行個體加簽減簽BUG
- 解決之法
- 說明
- 用法
前言
flowable 優秀的工作流流程引擎架構,前身Activity
為什麼要用工作流?
主要是應對:
- 流程可能随時變更
- 步驟處理人可能變更
- 并行任務處理
- 分支任務處理
- 駁回處理
- 等等
如果你不用類似于flowable工作流,久而久之你要麼自己建立一套工作流架構,要麼用flowable,這是必然發展之路。
有現車的成熟工作流架構為何不用?
flowable6.4.2 不足之處
即便如 flowable這樣優秀的架構,也比較難對付中國的特色工作流。
你會遇到下面的業務需求:
【任務3】的處理人稽核不通過後 要駁回給 【并行任務2-1-1】和【并行任務2-3-3】有可能就這兩步處理人填寫的内容有問題。
甚至還會遇到特事特辦,提前跳轉下面的步驟
還有遇到 并行網關 和 多執行個體綜合場景, 某一步驟跳轉至串行多執行個體場景。
雖然flowable 相較于Activity已經有很多改進之處,flowable的作者也意識到中國的特色工作流需求,也提供了不少跳轉之類的接口。
但一般用過的應該發現,針對并行網關的跳轉,實際上是有BUG的
例如下面的場景:
T5 要駁回給T2-2 和 T4-2 , 發現最後怎麼也沒辦法流轉到T5, 原因就是少了一條 T3-2的送出完成記錄。
檢視 act_ru_execution 表中記錄
SELECT a.* FROM act_ru_execution a
WHERE a.PROC_INST_ID_ = @PROC_INST_ID_
ORDER BY a.START_TIME_ DESC
首先表act_ru_execution 記錄中必須存在三條記錄,表示并行網關的三條分支,其次走完條,字段 IS_ACTIVE_ 的值為0,然後flowable6.4.2版本跳轉後并沒有為并行網關生成所有的分支execution。
還有更加複雜的嵌套并行網關駁回處理:
請問 T7 駁回至T5 要怎麼跳轉 ????
如何在act_ru_execution 補齊所有的并行網關的分支execution記錄??
在業務需求上 T7 作為稽核員,他發現就T5送出的有問題,難不成要全部駁回至其實任務步驟? 是以不能說這樣的需求是變态需求,無法實作。
解決諸如上面所述的各類并行網關的需求,一個看下流程是否可以變通,通過分支網關+表達式來優化,另外隻能擴充flowable的接口業務邏輯了
flowable 提供了人性化的多執行個體任務 減簽加簽接口
網上也有很多部落格例子,但你會發現他們大多數測試的是并行多執行個體下的業務場景,而且大多數隻是測試了加簽,并沒有測試減簽。
當你測試串行多執行個體加簽減簽時,你會遇到一些BUG,總之你會發現多執行個體核心變量數值一直有問題,而且串行多執行個體減簽會變成兩個任務等異常BUG發生。
- nrOfInstances 目前任務總數
- nrOfCompletedInstances 已完成任務總數 串行多執行個體BUG
- nrOfActiveInstances 目前活動任務總數 該值加簽後并未更新
解決之法
自定義flowable BPM2流程引擎接口封裝元件
bpm2-spring-boot-starter
裡面包含了跳轉、加減簽、輸出流程圖自定義高亮節點顔色等方法。
由于代碼過多,無法在部落格裡面貼出,請移步下面的github或碼雲
碼雲
https://gitee.com/banana6/bpm2-boot-starter/tree/main/bpm2-spring-boot-starter
github
https://github.com/dwhgygzt/bpm2-boot-starter/tree/main/bpm2-spring-boot-starter
- 該元件專門針對BPM流程引擎常用接口進行封裝
- 目标是為了開發團隊統一使用規範
- 封裝整理了常用的流程操作接口(檢視流程定義、啟動流程)
- 封裝整理常用的任務操作接口(送出、跳轉、駁回到并行網關中的某幾條分支)
- 暫不支援子流程相關操作,一般沒有涉及這方面的業務場景
- pom.xml 檔案引入如下配置
<!-- 對象存儲通用接口 -->
<dependency>
<groupId>com.middol</groupId>
<artifactId>bpm2-spring-boot-starter</artifactId>
<version>最新版本号</version>
</dependency>
- application.yml 增加如下配置,假設簡單配置如下:
##########################redisclent##############################
middol:
bpm2:
new-process-engine-config: true
database-schema-update: true
async-executor-activate: false
##################################################################
- 參數 new-process-engine-config
true: 業務系統目前沒有任何flowable相關的配置,引入本配置将新配置一個流程引擎
false: 業務系統本身已經有flowable相關的配置(例如:flowable-spring-boot-starter),不想重複配置流程引擎
- 當 new-process-engine-config 為 fasle
async-executor-activate 和 database-schema-update 無需配置
這兩個參數意思:
database-schema-update: true = flowable引擎自動建立表
async-executor-activate: true =在流程引擎啟動就激活AsyncExecutor
- 業務代碼中引入service
@Service
public class MyBusinessServiceImpl {
// 使用者任務相關接口
@Resource
private BpmUserTaskService bpmUserTaskService;
// 流程部署查詢操作接口
@Resource
private BpmProcessService bpmProcessService;
}
- 針對駁回到并行網關上的某幾個分支節點
- 先調用bpmUserTaskService查詢目前任務之前流轉過的任務節點
/**
* 【本任務節點】的上一步【曆史任務節點】清單
*
* @param query ignore
* @return ignore
*/
List<BpmTaskModelEntity> listBackTaskModel(BpmBackTaskModelQuery query);
/**
* 【本任務節點】之前的【曆史任務節點】清單
*
* @param query ignore
* @return ignore
*/
List<BpmTaskModelEntity> listAllBackTaskModel(BpmBackTaskModelQuery query);
到底調用哪一個,根據自身業務需求決定。
另外檢視 BpmTaskModelEntity 類可以看出,裡面有标志位:是否多執行個體,是否并行網關上節點,歸屬的并行網關id
這裡查詢的清單沒有做排序,業務系統可根據節點編号進行自行排序,另外可以将相同并行網關id的 歸屬到一個集合裡面。
- 調用bpmUserTaskService跳轉接口
void jump(BpmJumpForm form);
檢視 BpmJumpForm 參數對象如下:
/**
* 流程跳轉(适用于選擇曆史任務步驟駁回場景,跳轉指定任務,并行網關跳轉)
*
* @author <a href="mailto:[email protected]">guzhongtao</a>
*/
public class BpmJumpForm extends BpmBaseParam {
private static final long serialVersionUID = 1L;
/**
* 目前任務節點
*/
private String taskId;
/**
* 目标任務節點key
*/
private List<String> targetTaskDefineKes;
/**
* 需要設定的全局相關參數,全局變量
*/
private Map<String, Object> variables;
// ...... 省略部分代碼.......
}
- taskId : 目前執行駁回跳轉的任務id
- targetTaskDefineKes: 表示你要跳轉到的任務節點,該值是你在畫流程圖時指定的任務ID編号, 該值從BpmTaskModelEntity 對象中可以取到。 說明: 如果為多個,則裡面的任務必須全部都是并行網關上的任務節點。
-
針對多執行個體加簽減簽
調用 bpmUserTaskService
/**
* 多執行個體-加簽
*
* @param form ignore
*/
void addMultiInstanceExecution(BpmMultInstAddForm form);
/**
* 多執行個體-減簽
*
* @param form ignore
*/
void deleteMultiInstanceExecution(BpmMultInstDeleteForm form);
這裡說明一下,加簽減簽是 多執行個體裡面的任務處理者進行操作的,如果還沒有到達多執行個體任務節點,則不存在多執行個體加簽減簽業務。
是以請看 BpmMultInstAddForm 和 BpmMultInstDeleteForm
裡面有一個共同參數: multiInstanceTaskId(目前操作的任務id)
在減簽的時候,需要調用查詢接口,查詢可以減簽的人員清單,當然不包含自己。
/**
* 擷取目前多執行個體任務除自己外的其他使用者資訊清單,
* 用于 減簽 業務場景
*
* @param multiInstanceTaskId 目前多執行個體使用者任務id
* @return List
*/
List<MultiInstanceUserDTO> getOtherMultiInstanceUsers(String multiInstanceTaskId);