關鍵詞:Flowable任務節(jié)點跳轉,F(xiàn)lowable節(jié)點跳轉汁讼,F(xiàn)lowable任意節(jié)點跳轉。
在使用Flowable或者Activiti的時候,有時候我們并不期望他按照模板的定義進行運轉号显,比如如下的一個流程圖:
正常的流程應該是shareniu1-->shareniu2-->shareniu3-->shareniu4。
如果現(xiàn)在打算讓shareniu1跳轉到shareniu3躺酒,這個時候就需要繪制一根連線押蚤,并在連線中配置一些條件。其他的節(jié)點場景相似羹应,但是實際項目開發(fā)揽碘,可能我們不想繪制太多的連線,就期望流程實例可以隨便的跳轉园匹,這個問題也是我們本文重點要講解雳刺。
1.將上述的流程進行部署。
數(shù)據(jù)庫的變化如下所示:
2.啟動流程實例:
@Test
public void start1() {
runtimeService.startProcessInstanceByKey("jump");
}
act_ru_task表的數(shù)據(jù)如下:
這個時候裸违,我們打算讓shareniu1直接跳轉到shareniu3掖桦,能跳轉過去嗎?我們不妨寫一個命令類試一下供汛。
3.任意節(jié)點跳轉實現(xiàn)代碼:
/**
*
* @author 分享牛 http://www.shareniu.com/
*/
public class ShareniuCommonJumpTaskCmd implements Command {
protected String taskId;
protected String target;
public ShareniuCommonJumpTaskCmd(String taskId, String target) {
this.taskId = taskId;
this.target = target;
}
public Void execute(CommandContext commandContext) {
ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager();
TaskEntityManager taskEntityManager = CommandContextUtil.getTaskEntityManager();
TaskEntity taskEntity = taskEntityManager.findById(taskId);
ExecutionEntity ee = executionEntityManager.findById(taskEntity.getExecutionId());
Process process = ProcessDefinitionUtil.getProcess(ee.getProcessDefinitionId());
FlowElement targetFlowElement = process.getFlowElement(target);
ee.setCurrentFlowElement(targetFlowElement);
FlowableEngineAgenda agenda = CommandContextUtil.getAgenda();
agenda.planContinueProcessInCompensation(ee);
taskEntityManager.delete(taskId);
return null;
}
}
4.測試代碼:
接下來枪汪,開始測試涌穆,實例代碼如下:
@Test
public void jump() {
ManagementService managementService = processEngine.getManagementService();
managementService.executeCommand(new ShareniuCommonJumpTaskCmd("2505","shareniu3"));
}
act_ru_task表的數(shù)據(jù)如下:
通過這里可以看出,我們的命令類已經生效了雀久。那我們再次執(zhí)行下上述代碼讓shareniu3跳轉到shareniu2試下宿稀,實例代碼如下:
@Test
public void jump() {
ManagementService managementService = processEngine.getManagementService();
managementService.executeCommand(new ShareniuCommonJumpTaskCmd("5002","shareniu2"));
}
act_ru_task表的數(shù)據(jù)如下:
上述的命令類確實很好用的。
5.上述跳轉命令類的缺陷:
1.上述的命令類只適用于6.x版本的引擎赖捌。包括模板以及實例都是6.x版本原叮。
2.只適用于常規(guī)節(jié)點的跳轉。(關于分支節(jié)點的跳轉巡蘸、多實例節(jié)點的跳轉以及并行節(jié)點的跳轉后續(xù)文章會詳細說明)奋隶。
3.上述的代碼適用于flowable6.1.2以后的版本。關于flowable6.1.2之前的版本思路一樣悦荒,只是代碼要稍微微調一下唯欣,部分代碼如下所示:
ExecutionEntityManager executionEntityManager = commandContext.getExecutionEntityManager();
TaskEntityManager taskEntityManager = commandContext.getTaskEntityManager();
注意:flowable6.1.2只是對代碼所在的包進行了調整,核心思想并沒有變化搬味。
4.關于flowable5.x版本的跳轉(分支節(jié)點的跳轉境氢、多實例節(jié)點的跳轉以及并行節(jié)點的跳轉)可以參考Activiti權威指南一書。