关键词:Flowable任务节点跳转,Flowable节点跳转,Flowable任意节点跳转。
在使用Flowable或者Activiti的时候,有时候我们并不期望他按照模板的定义进行运转,比如如下的一个流程图:
正常的流程应该是shareniu1-->shareniu2-->shareniu3-->shareniu4。
如果现在打算让shareniu1跳转到shareniu3,这个时候就需要绘制一根连线,并在连线中配置一些条件。其他的节点场景相似,但是实际项目开发,可能我们不想绘制太多的连线,就期望流程实例可以随便的跳转,这个问题也是我们本文重点要讲解。
1.将上述的流程进行部署。
数据库的变化如下所示:
2.启动流程实例:
@Test
public void start1() {
runtimeService.startProcessInstanceByKey("jump");
}
act_ru_task表的数据如下:
这个时候,我们打算让shareniu1直接跳转到shareniu3,能跳转过去吗?我们不妨写一个命令类试一下。
3.任意节点跳转实现代码:
/**
*
* @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表的数据如下:
通过这里可以看出,我们的命令类已经生效了。那我们再次执行下上述代码让shareniu3跳转到shareniu2试下,实例代码如下:
@Test
public void jump() {
ManagementService managementService = processEngine.getManagementService();
managementService.executeCommand(new ShareniuCommonJumpTaskCmd("5002","shareniu2"));
}
act_ru_task表的数据如下:
上述的命令类确实很好用的。
5.上述跳转命令类的缺陷:
1.上述的命令类只适用于6.x版本的引擎。包括模板以及实例都是6.x版本。
2.只适用于常规节点的跳转。(关于分支节点的跳转、多实例节点的跳转以及并行节点的跳转后续文章会详细说明)。
3.上述的代码适用于flowable6.1.2以后的版本。关于flowable6.1.2之前的版本思路一样,只是代码要稍微微调一下,部分代码如下所示:
ExecutionEntityManager executionEntityManager = commandContext.getExecutionEntityManager();
TaskEntityManager taskEntityManager = commandContext.getTaskEntityManager();
注意:flowable6.1.2只是对代码所在的包进行了调整,核心思想并没有变化。
4.关于flowable5.x版本的跳转(分支节点的跳转、多实例节点的跳转以及并行节点的跳转)可以参考Activiti权威指南一书。