Flowable节点跳转

来源:互联网 发布:java游戏开发工程师 编辑:程序博客网 时间:2024/06/13 23:40

关键词: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<Void> {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.测试代码:

接下来,开始测试,实例代码如下:

@Testpublic void jump() {    ManagementService managementService = processEngine.getManagementService();    managementService.executeCommand(new ShareniuCommonJumpTaskCmd("2505","shareniu3"));}

act_ru_task表的数据如下:

 

 

通过这里可以看出,我们的命令类已经生效了。那我们再次执行下上述代码让 shareniu3跳转到shareniu2试下,实例代码如下:

@Testpublic 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只是对代码所在的包进行了调整,核心思想并没有变化。

原创粉丝点击