Flowable节点跳转

关键词:Flowable任务节点跳转,Flowable节点跳转,Flowable任意节点跳转。

在使用Flowable或者Activiti的时候,有时候我们并不期望他按照模板的定义进行运转,比如如下的一个流程图:

Flowable节点跳转_第1张图片

正常的流程应该是shareniu1-->shareniu2-->shareniu3-->shareniu4。

如果现在打算让shareniu1跳转到shareniu3,这个时候就需要绘制一根连线,并在连线中配置一些条件。其他的节点场景相似,但是实际项目开发,可能我们不想绘制太多的连线,就期望流程实例可以随便的跳转,这个问题也是我们本文重点要讲解。

1.将上述的流程进行部署。

数据库的变化如下所示:

Flowable节点跳转_第2张图片

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

你可能感兴趣的:(flowable,工作流)