activiti7审批驳回,控制变量无法覆盖,导致无限循环驳回,流程无法结束

项目开发过程中使用工作流,因此考虑使用activiti7做完工作流引擎。项目开发过程中,发现流程驳回时,再次执行流程,控制变量无法覆盖,导致无限循环驳回,流程无法结束。流程图如下图所示:

驳回控制变量及流程图

审批结束控制变量及流程图

1.设置控制变量值为false,驳回流程到上一阶段,代码如下所示:

复制代码
    /**
     * 审批节点,驳回
     */
    @Test
    public void doCheckRejectTask() {
        List<Task> taskList = taskService.createTaskQuery()
                .processDefinitionKey("rejectProcess")
//                .processInstanceId()
//                .taskAssignee(assignee)
                .list();

        for (Task task : taskList) {
            Map<String, Object> varMap = new HashMap<>();
            // 驳回控制变量,重点
            varMap.put("checkPass", false);
            taskService.addComment(task.getId(), task.getProcessInstanceId(), "审批通过--测试xx");
            taskService.complete(task.getId(), varMap);
        }
    }

2.重新执行流程,审批结束,结束流程

此处虽然设置控制变量为true,流程审批结束,但实际执行过程中,流程并未结束,仍然是驳回上一流程阶段,查看相关资料及文档,说是activiti7的bug,升级到7.1.0.M4可解决,于是升级版本,最后发现仍然存在同样的问题。导致该问题原因是流程绑定的全局变量, 在taskService.complete无法覆盖。

复制代码
    /**
     * 审批结束
     */
    @Test
    public void doCheckRejectTask() {
        List<Task> taskList = taskService.createTaskQuery()
                .processDefinitionKey("rejectProcess")
//                .processInstanceId()
//                .taskAssignee(assignee)
                .list();

        for (Task task : taskList) {
            Map<String, Object> varMap = new HashMap<>();
            varMap.put("checkPass", true);
            taskService.addComment(task.getId(), task.getProcessInstanceId(), "审批结束--测试xx");
            taskService.complete(task.getId(), varMap);
        }
    }

3.解决方案

既然流程绑定的全局变量, 在taskService.complete无法覆盖,那么就想办法覆盖变量值即可,因此只需要重新设置变量。解决方案有2种方式,第一种是设置局部变量覆盖;第二种是设置全局变量覆盖。如下图所示:

复制代码
    /**
     * 审批结束
     */
    @Test
    public void doCheckRejectTask() {
        List<Task> taskList = taskService.createTaskQuery()
                .processDefinitionKey("rejectProcess")
//                .processInstanceId()
//                .taskAssignee(assignee)
                .list();

        for (Task task : taskList) {
            Map<String, Object> varMap = new HashMap<>();
            varMap.put("checkPass", true);
            // 设置局部变量覆盖和设置全局变量覆盖二选一即可
            // 1.设置局部变量覆盖
            taskService.setVariablesLocal(task.getId(), varMap);
            // 2.设置全局变量覆盖
            // taskService.setVariables(task.getId(), varMap);
            
            taskService.addComment(task.getId(), task.getProcessInstanceId(), "审批结束");
            taskService.complete(task.getId(), varMap);
        }
    }

4.相关大数据学习demo地址:

https://github.com/carteryh/big-data

相关推荐
魔镜魔镜_谁是世界上最漂亮的小仙女几秒前
java-集合
java·后端·程序员
真实的菜2 分钟前
消息队列高级特性与原理:解锁分布式系统的底层逻辑
java
若水不如远方3 分钟前
java范型
java
凌辰揽月6 分钟前
Web后端基础(基础知识)
java·开发语言·前端·数据库·学习·算法
lifallen12 分钟前
深入浅出 Arrays.sort(DualPivotQuicksort):如何结合快排、归并、堆排序和插入排序
java·开发语言·数据结构·算法·排序算法
长安不见14 分钟前
背景知识: 理解LimitLatch背后的AQS
java
小吕学编程16 分钟前
策略模式实战:Spring中动态选择商品处理策略的实现
java·开发语言·设计模式
weixin_4383354022 分钟前
Spring Boot实现接口时间戳鉴权
java·spring boot·后端
pan_junbiao1 小时前
Spring框架的设计模式
java·spring·设计模式
远方16091 小时前
0x-2-Oracle Linux 9上安装JDK配置环境变量
java·linux·oracle