摘要:跳轉方法當前任務獲取流程定義獲取目標節點定義刪除當前運行任務流程執行到來源節點刪除當前運行時任務命令,并返回當前任務的執行對象這里繼承了,主要時很多跳轉業務場景下,要求不能時掛起任務。
前言
工作快2年的小白,如有錯誤,懇請大家批評指點,這也是開始寫博客的一個初衷,能夠在分享互動、知識梳理中進步。
之前工作的項目使用activiti5進行企業流程系統開發,現在這份工作也開始需要流程開發,了解到activiti6扔掉了原來的pvm,直接針對bpmn進行處理,性能有了一定的提升;也有看到flowable6,雖說是activiti原班人馬出來的,但是實在太新了、用的人也少,小白不敢輕易下手,于是選擇了activiti6。說了好多廢話。。正題正題
最為安全可靠,不修改Activiti自身執行和流程定義對象,但是對于中國式流程的功能需求(駁回、回退等),經常是要求在沒有連線的情況下完成跳轉,靈活性不夠。
2.動態修改流程定義環節的連線,然后執行跳轉,完成后再恢復流程定義Activiti5中實現,文中第二種
Activiti6中實現
這種方法可以實現動態跳轉,不需要修改Activiti自身執行,但是會動態修改系統中的流程定義緩存對象。理論上這會出現一個多線程下,全局變量不安全的問題。單個Activiti流程引擎中,流程定義緩存對象是被所有線程共用的,當一個應用服務器同時收到兩個不同流程實例、同個流程定義、同個環節的任務提交請求。a要求駁回,所以該線程動態修改了流程定義;與此同時,b要求正常流轉,但是執行過程中,依據的流程定義已被修改,可能導致b也走向了駁回。
Activiti5中實現
Activiti5中實現,文中第一種
這種方法即可以實現動態跳轉,又沒有動態修改流程定義帶來的不安全問題,而activiti6中因為pvm下的包都刪了,執行計劃的代碼也進行了改造,原來的方法就不可用了。沒找到相關介紹,自己根據原先的思路,學習Activiti6源碼,找到了實現的方法,下面提供代碼。
//跳轉方法 public void jump(String taskId){ //當前任務 Task currentTask = taskService.createTaskQuery().taskId(taskId).singleResult(); //獲取流程定義 Process process = repositoryService.getBpmnModel(currentTask.getProcessDefinitionId()).getMainProcess(); //獲取目標節點定義 FlowNode targetNode = (FlowNode)process.getFlowElement("startTask"); //刪除當前運行任務 String executionEntityId = managementService.executeCommand(new DeleteTaskCmd(currentTask.getId())); //流程執行到來源節點 managementService.executeCommand(new SetFLowNodeAndGoCmd(targetNode, executionEntityId)); } ------------------ //刪除當前運行時任務命令,并返回當前任務的執行對象id //這里繼承了NeedsActiveTaskCmd,主要時很多跳轉業務場景下,要求不能時掛起任務。可以直接繼承Command即可 public class DeleteTaskCmd extends NeedsActiveTaskCmd最后{ public DeleteTaskCmd(String taskId){ super(taskId); } public String execute(CommandContext commandContext, TaskEntity currentTask){ //獲取所需服務 TaskEntityManagerImpl taskEntityManager = (TaskEntityManagerImpl)commandContext.getTaskEntityManager(); //獲取當前任務的來源任務及來源節點信息 ExecutionEntity executionEntity = currentTask.getExecution(); //刪除當前任務,來源任務 taskEntityManager.deleteTask(currentTask, "jumpReason", false, false); return executionEntity.getId(); } public String getSuspendedTaskException() { return "掛起的任務不能跳轉"; } } ------------------ //根據提供節點和執行對象id,進行跳轉命令 public class SetFLowNodeAndGoCmd implements Command { private FlowNode flowElement; private String executionId; public SetFLowNodeAndGoCmd(FlowNode flowElement,String executionId){ this.flowElement = flowElement; this.executionId = executionId; } public Void execute(CommandContext commandContext){ //獲取目標節點的來源連線 List flows = flowElement.getIncomingFlows(); if(flows==null || flows.size()<1){ throw new ActivitiException("回退錯誤,目標節點沒有來源連線"); } //隨便選一條連線來執行,時當前執行計劃為,從連線流轉到目標節點,實現跳轉 ExecutionEntity executionEntity = commandContext.getExecutionEntityManager().findById(executionId); executionEntity.setCurrentFlowElement(flows.get(0)); commandContext.getAgenda().planTakeOutgoingSequenceFlowsOperation(executionEntity, true); return null; } }
以上就是對Activiti6實現自由跳轉的介紹。后面會再繼續介紹
1.以上述自由跳轉為基礎實現不改變原先任務id的駁回即處理人小王完成環節A的任務(id=6000)后,流程走到下一環節B生成任務(id=6004),任務(id=6004)處理人小張審核不通過執行駁回,流程流轉回環節A,環節A重新生成一條id=6000的待處理人為小王的任務。
2.java類方式進行Activiti6配置、spring集成包括字體配置、自定義全局事件監聽、流程定義自動部署開關配置
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76370.html
摘要:當一個根級的結束時,就會進行上述的緩存對象統一的持久化。解決的辦法也很簡單,改為監聽,判斷是否時需要修改的任務實體即可。這樣后面要進行駁回時,只要通過這樣關系表,馬上就可以定位到要駁回到的任務了。 1.前言 本文內容主要為以下兩點,因為內容有交叉,所以會放在一起介紹。 1.以自由跳轉為基礎實現不改變原先任務id的駁回關于Activiti6動態跳轉可以查看我的另一篇文章Activiti...
摘要:如圖流程引擎創建完成后,只會對進行操作,屬性數據表存儲整個流程引擎級別的數據初始化表結構時,會默認插入四條記錄,流程部署測試流程部署,先把上面的流程引擎配置的注解改為。如圖資源流程定義數據表這里面存放的就是我們部署的資源元數據信息。 關于activiti是什么,我這里就不多說了,我們直接上路,O(∩_∩)O哈哈~ 引擎配置 配置方式有好幾種:1): /** * 獲取默認的流程引擎實例...
摘要:升級版延遲深度鏈接技術相比,增加了一個判斷,能在用戶點擊鏈接時判斷設備是否安裝了目標,如果沒有安裝,則跳轉應用市場或者瀏覽器中引導下載,用戶安裝后再次實現的場景還原功能。 移動互聯網時代,信息的分享傳播無疑是 App 引流增長的關鍵,與其花費大量精力和成本找渠道、硬推廣,不如從細節下手,用最快最簡便的方法實現 Deeplink(深度鏈接)技術,打破信息孤島、縮短分享路徑、優化用戶體驗,...
閱讀 1436·2021-09-02 19:23
閱讀 1586·2021-08-11 11:19
閱讀 641·2019-08-30 15:55
閱讀 1653·2019-08-30 12:50
閱讀 2241·2019-08-30 11:23
閱讀 2180·2019-08-29 13:13
閱讀 1500·2019-08-28 18:13
閱讀 3344·2019-08-26 11:53