Activiti6实现自由跳转

前言

工作快2年的小白,如有错误,恳请大家批评指点,这也是开始写博客的一个初衷,能够在分享互动、知识梳理中进步。
之前工作的项目使用activiti5进行企业流程系统开发,现在这份工作也开始需要流程开发,了解到activiti6扔掉了原来的pvm,直接针对bpmn进行处理,性能有了一定的提升;也有看到flowable6,虽说是activiti原班人马出来的,但是实在太新了、用的人也少,小白不敢轻易下手,于是选择了activiti6。说了好多废话。。正题正题

Activiti实现跳转的方式有三种:

1.流程图配置连线,正常流转

最为安全可靠,不修改Activiti自身执行和流程定义对象,但是对于中国式流程的功能需求(驳回、回退等),经常是要求在没有连线的情况下完成跳转,灵活性不够。

2.动态修改流程定义环节的连线,然后执行跳转,完成后再恢复流程定义

Activiti5中实现,文中第二种
Activiti6中实现
这种方法可以实现动态跳转,不需要修改Activiti自身执行,但是会动态修改系统中的流程定义缓存对象。理论上这会出现一个多线程下,全局变量不安全的问题。单个Activiti流程引擎中,流程定义缓存对象是被所有线程共用的,当一个应用服务器同时收到两个不同流程实例、同个流程定义、同个环节的任务提交请求。a要求驳回,所以该线程动态修改了流程定义;与此同时,b要求正常流转,但是执行过程中,依据的流程定义已被修改,可能导致b也走向了驳回。

3.直接指定当前流程实例执行所选的环节

Activiti5中实现
Activiti5中实现,文中第一种
这种方法即可以实现动态跳转,又没有动态修改流程定义带来的不安全问题,而activiti6中因为pvm下的包都删了,执行计划的代码也进行了改造,原来的方法就不可用了。没找到相关介绍,自己根据原先的思路,学习Activiti6源码,找到了实现的方法,下面提供代码。

//跳转方法
public void jump(String taskId){
        //当前任务
        Task currentTask = taskService.createTaskQuery().taskId(taskId).singleResult();
        //获取流程定义
        Process process = repositoryService.getBpmnModel(currentTask.getProcessDefinitionId()).getMainProcess();
        //获取目标节点定义
        FlowNode targetNode = (FlowNode)process.getFlowElement("startTask");
        //删除当前运行任务
        String executionEntityId = managementService.executeCommand(new DeleteTaskCmd(currentTask.getId()));
        //流程执行到来源节点
        managementService.executeCommand(new SetFLowNodeAndGoCmd(targetNode, executionEntityId));
    }
------------------
//删除当前运行时任务命令,并返回当前任务的执行对象id
//这里继承了NeedsActiveTaskCmd,主要时很多跳转业务场景下,要求不能时挂起任务。可以直接继承Command即可
public class DeleteTaskCmd extends NeedsActiveTaskCmd<String> {
    public DeleteTaskCmd(String taskId){
        super(taskId);
    }
    public String execute(CommandContext commandContext, TaskEntity currentTask){
        //获取所需服务
        TaskEntityManagerImpl taskEntityManager = (TaskEntityManagerImpl)commandContext.getTaskEntityManager();
        //获取当前任务的来源任务及来源节点信息
        ExecutionEntity executionEntity = currentTask.getExecution();
        //删除当前任务,来源任务
        taskEntityManager.deleteTask(currentTask, "jumpReason", false, false);
        return executionEntity.getId();
    }
    public String getSuspendedTaskException() {
        return "挂起的任务不能跳转";
    }
}
------------------
//根据提供节点和执行对象id,进行跳转命令
public class SetFLowNodeAndGoCmd implements Command<Void> {
    private FlowNode flowElement;
    private String executionId;
    public SetFLowNodeAndGoCmd(FlowNode flowElement,String executionId){
        this.flowElement = flowElement;
        this.executionId = executionId;
    }

    public Void execute(CommandContext commandContext){
        //获取目标节点的来源连线
        List<SequenceFlow> flows = flowElement.getIncomingFlows();
        if(flows==null || flows.size()<1){
            throw new ActivitiException("回退错误,目标节点没有来源连线");
        }
        //随便选一条连线来执行,时当前执行计划为,从连线流转到目标节点,实现跳转
        ExecutionEntity executionEntity = commandContext.getExecutionEntityManager().findById(executionId);
        executionEntity.setCurrentFlowElement(flows.get(0));
        commandContext.getAgenda().planTakeOutgoingSequenceFlowsOperation(executionEntity, true);
        return null;
    }
}

最后

以上就是对Activiti6实现自由跳转的介绍。后面会再继续介绍

1.以上述自由跳转为基础实现不改变原先任务id的驳回

即处理人小王完成环节A的任务(id=6000)后,流程走到下一环节B生成任务(id=6004),任务(id=6004)处理人小张审核不通过执行驳回,流程流转回环节A,环节A重新生成一条id=6000的待处理人为小王的任务。

2.java类方式进行Activiti6配置、spring集成

包括字体配置、自定义全局事件监听、流程定义自动部署开关配置

177 声望
182 粉丝
0 条评论
推荐阅读
网狐荣耀6701/6801 手机打包发布
本篇将介绍网狐cocos2dx-lua工程打包android的apk、ios编译过程以及vs2015模拟运行和调试、lua脚本热更新。关于网狐的服务端编译运行,请查看网狐6701/6801服务端编译 测试部署

坐死等吃1阅读 9k

一文搞懂秒杀系统,欢迎参与开源,提交PR,提高竞争力。早日上岸,升职加薪。
前言秒杀和高并发是面试的高频考点,也是我们做电商项目必知必会的场景。欢迎大家参与我们的开源项目,提交PR,提高竞争力。早日上岸,升职加薪。知识点详解秒杀系统架构图秒杀流程图秒杀系统设计这篇文章一万多...

王中阳Go32阅读 2.4k评论 1

封面图
计算机网络连环炮40问
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~

程序员大彬14阅读 1.7k

万字详解,吃透 MongoDB!
MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C++ 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常...

JavaGuide8阅读 1.6k

封面图
花了半个小时基于 ChatGPT 搭建了一个微信机器人
相信大家最近被 ChatGPT 刷屏了,其实在差不多一个月前就火过一次,不会那会好像只在程序员的圈子里面火起来了,并没有被大众认知到,不知道最近是因为什么又火起来了,而且这次搞的人尽皆知。

Java极客技术12阅读 3.1k评论 3

封面图
数据结构与算法:二分查找
一、常见数据结构简单数据结构(必须理解和掌握)有序数据结构:栈、队列、链表。有序数据结构省空间(储存空间小)无序数据结构:集合、字典、散列表,无序数据结构省时间(读取时间快)复杂数据结构树、 堆图二...

白鲸鱼9阅读 5.2k

PHP转Go实践:xjson解析神器「开源工具集」
我和劲仔都是PHP转Go,身边越来越多做PHP的朋友也逐渐在用Go进行重构,重构过程中,会发现php的json解析操作(系列化与反序列化)是真的香,弱类型语言的各种隐式类型转换,很大程度的减低了程序的复杂度。

王中阳Go11阅读 2.7k评论 4

封面图
177 声望
182 粉丝
宣传栏