【Activity】ワークフローの任意のノードにジャンプします(この例では、前のノードにジャンプして説明するプロセスロールバックを使用します).

1819 ワード

使用するサービスおよびインプリメンテーションクラスはすべてワークフロー(Activity)そのものです.
public String taskRollback(String taskId){
	//        ID     
	HistoricTaskInstance hisTask = historyService
                .createHistoricTaskInstanceQuery().taskId(taskId)
                .singleResult();
    //        
    ProcessInstance instance = runtimeService
                .createProcessInstanceQuery()
                .processInstanceId(hisTask.getProcessInstanceId())
                .singleResult();
    //      
    ProcessDefinitionEntity definition = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(hisTask.getProcessDefinitionId());
    //       Activity
    ActivityImpl hisActivity = definition.findActivity(hisTask.getTaskDefinitionKey());
    //    
    managementService.executeCommand(new JumpCmd(instance.getId(), hisActivity.getId()));
}

public class JumpCmd implements Command{

    private String processInstanceId;
    private String activityId;
    public static final String REASION_DELETE = "deleted";
    
    public JumpCmd(String processInstanceId, String activityId) {
        this.processInstanceId = processInstanceId;
        this.activityId = activityId;
    }
    
    @Override
    public ExecutionEntity execute(CommandContext commandContext) {
        ExecutionEntity executionEntity = commandContext.getExecutionEntityManager().findExecutionById(processInstanceId);
        
        executionEntity.destroyScope(REASION_DELETE);
        ProcessDefinitionImpl processDefinition = executionEntity.getProcessDefinition();
        ActivityImpl activity = processDefinition.findActivity(activityId);
        executionEntity.executeActivity(activity);
        
        return executionEntity;
    }

}

このJumpCmd法ですべてのフローノードのジャンプを実現できる.