A-A+
Activiti6.0 – 节点跳转
之前一直在试验Flowable的节点跳转,可以参见以下文章:
但是,Activiti并没有这些API接口,那么应该如何实现呢?接下来就实现一下简单流程节点的跳转。
首先,本文是基于Command接口实现,关于Activiti中的Command会在之后的文章中详解一下,本篇文章就暂时只是说明如何实现、使用。
先上流程图,如下:

非常简单的一个流程,只包含开始、结束和三个用户节点。这样的流程在正常流转时,会在表act_ru_execution内生成两条数据:

在表act_ru_task内生成一条数据:

并且,在流程的流转过程中,基本保持不变:

D_没有变化,只有ACT_ID_有所变化

ID_和TASK_DEF_KEY_有变化,所属EXECUTION_ID_无变化
所以,只需要删除掉act_ru_task表中的数据,然后让流程向指定节点流转即可。
此时,就需要利用Command接口实现,具体的代码如下:
/**
* 移动节点命令
*/
public class MoveSingleCommand implements Command<Object> {
/**
* 当前TaskId
*/
private String currentTaskId;
/**
* 目标流程定义节点Id
*/
private String targetNodeId;
public MoveSingleCommand(String currentTaskId, String targetNodeId) {
this.currentTaskId = currentTaskId;
this.targetNodeId = targetNodeId;
}
public String getCurrentTaskId() {
return currentTaskId;
}
public void setCurrentTaskId(String currentTaskId) {
this.currentTaskId = currentTaskId;
}
public String getTargetNodeId() {
return targetNodeId;
}
public void setTargetNodeId(String targetNodeId) {
this.targetNodeId = targetNodeId;
}
@Override
public Object execute(CommandContext commandContext) {
ExecutionEntityManager executionEntityManager = commandContext.getExecutionEntityManager();
TaskEntityManager taskEntityManager = commandContext.getTaskEntityManager();
TaskEntity taskEntity = taskEntityManager.findById(this.currentTaskId);
ExecutionEntity executionEntity = executionEntityManager.findById(taskEntity.getExecutionId());
Process process = ProcessDefinitionUtil.getProcess(executionEntity.getProcessDefinitionId());
taskEntityManager.deleteTask(taskEntity, "移动节点", true, true);
FlowElement targetFlowElement = process.getFlowElement(targetNodeId);
executionEntity.setCurrentFlowElement(targetFlowElement);
ActivitiEngineAgenda agenda = commandContext.getAgenda();
agenda.planContinueProcessInCompensation(executionEntity);
return null;
}
}
然后开放一个Url地址执行此Command即可,代码如下:
/**
* 移动节点
*/
@RequestMapping(value = "move/{taskId}/{toNodeId}")
public void move(@PathVariable("taskId") String taskId,
@PathVariable("toNodeId") String toNodeId) {
managementService.executeCommand(new MoveSingleCommand(taskId, toNodeId));
}
链接地址示例:
http://localhost:8080/activiti/flow/move/150085/UserTask1
可以看到节点由UserTask2回退至UserTask1:


targetNodeId这个节点是最终需要跳转的节点,那我怎么知道这个节点的ID是啥?假如我现在有三个节点A,B,C,A审批完了之后到B审批的时候我要跳过,不走B,直接到C,那我应该如何获取C节点的节点ID?
自行分析Bpmn模型