zoukankan      html  css  js  c++  java
  • activiti任意节点任务跳转

       新项目中存在一个这样的业务逻辑,工作流节点任务的任意跳转。比如说一条流程A-B-C,现在A任务执行完了,按道理来说到B任务了,可是我不想经过B了,直接跳C节点任务执行。自己对工作流这块也不是很熟悉,在网上查阅了一些资料,修改了一下,也就实现了。现在记录分享一下。

    先附上参考链接吧:https://www.jianshu.com/p/3e3087b2213b  (还有一篇参考链接,恕我实在忘记了)

    /**
     * 跳转至指定活动节点
     * @param processId  流程Id
     * @param targetTaskDefinitionKey  目标节点任务的id
     */
    public void jump(String processId,String targetTaskDefinitionKey){
        //获取当前节点任务
        TaskEntity currentTask = (TaskEntity) taskService.createTaskQuery()
                .processInstanceId(processId).singleResult();
        jump(processId,currentTask,targetTaskDefinitionKey);
    }
        
        
    /**
     * @param currentTaskEntity 当前任务节点
     * @param targetTaskDefinitionKey  目标任务节点(在模型定义里面的节点任务Id)
     */
    private void jump(String processInstanceId,final TaskEntity currentTaskEntity, String targetTaskDefinitionKey){
        ProcessInstance processInstance=runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
        TaskEntity taskEntity=(TaskEntity) taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();  
       
        //获取流程定义
        ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(processInstance.getProcessDefinitionId());  
        //当前正在执行任务的节点  
    ActivityImpl currentActivity = (ActivityImpl)processDefinitionEntity.findActivity(processInstance.getActivityId());
    //跳转的目标节点  
    ActivityImpl targetActivity = (ActivityImpl) processDefinitionEntity.findActivity(targetTaskDefinitionKey); 
              
    ((RuntimeServiceImpl)runtimeService).getCommandExecutor()
            .execute(new Command<java.lang.Void>() {
                public Void execute(CommandContext commandContext) {
                    ExecutionEntity executionEntity = (ExecutionEntity) runtimeService
                             .createExecutionQuery().executionId(currentTaskEntity.getExecutionId()).singleResult();
                    executionEntity.setActivity(currentActivity);
                    executionEntity.setEventSource(currentActivity);
                    //根据executionId 获取Task
                    Iterator<TaskEntity> localIterator = Context.getCommandContext().getTaskEntityManager().findTasksByExecutionId(taskEntity.getExecutionId()).iterator();
                    while (localIterator.hasNext()) {
                        TaskEntity taskEntity = (TaskEntity) localIterator.next();
                        //删除任务
                        Context.getCommandContext().getTaskEntityManager().deleteTask(taskEntity, "跳转节点", true);
                    }
                    executionEntity.executeActivity(targetActivity);  //设置任务 执行对象
                    return null;
                }
            });
    }

    说明: (1)阅读了网上的资料,在processEngine初始化的时候,也会初始化CommandExcutor对象,execute方法中执行了真正的命令,将流程的当前节点任务,替换成目标节点任务对象。   

        (2) Context.getCommandContext().getTaskEntityManager().deleteTask(taskEntity, "跳转节点", true);这里如果传值是false的话,那么就会保留原有的历史任务信息,比如说A-B-C,A完成之后,正常走是到B,倘若我们A走完,直接跳到C的话,那么C做完之后,查询该流程的全过程节点任务就是A,B,C三条数据,如果写true,那么查询出来的数据就是A,B。所以这里根据场景决定传值吧。

    最后说下自己的想法吧,感觉工作流还是蛮强大的,帮助解决了不少问题,如果对bpmn理解到位了,也能快速使用。自己也还在探索阶段,一起加油吧。

  • 相关阅读:
    数组与列表访问某一列的方法不同
    python 切片
    mapreduce统计数据库中的单词个数
    Call From s150/192.168.109.150 to 0.0.0.0:10020 failed on connection exception:
    message from server: "Host 'XXXX' is not allowed to connect to this MySQL server"
    Hadoop格式化namenode
    构建FP-growth算法高效发现频繁项集
    TypeError: '
    矩阵与列表取出行(左开右闭)
    2.nohup和&后台运行,进程查看及终止
  • 原文地址:https://www.cnblogs.com/wei-cy/p/13020865.html
Copyright © 2011-2022 走看看