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