Activiti7 工作流非原流程终止

news2025/1/15 12:56:32

背景

在这里插入图片描述
正常工作流,需要经过 node1、node2 才能结束。
现在要求已经开启的流程,目前停留在 node1,可以提前终止。

方案

一般根据实际需要,可以有几种做法:

  1. 新绘制流程图,新增 node1 结束的流程分支,替换原流程
  2. SQL 的方式,将该流程的数据,手动修改为终止的状态
  3. 代码动态修改流程模型,并使其流转只流向终止状态

下面分析一下这些方式的应用场景及优缺点。

新绘制流程图

新流程图

在这里插入图片描述

替换原流程图

UPDATE ACT_GE_BYTEARRAY SET BYTES_ = '新流程的对应值' WHERE _ID = xxx AND NAME_ = 'xxxxx.bpmn';
## 以下根据情况可选,在使用 activiti5 时有碰到
UPDATE ACT_GE_BYTEARRAY SET BYTES_ = '新流程的对应值' WHERE _ID = xxx AND NAME_ = 'xxx.png';
UPDATE ACT_GE_BYTEARRAY SET BYTES_ = '新流程的对应值' WHERE _ID = xxx AND NAME_ = 'source';
UPDATE ACT_GE_BYTEARRAY SET BYTES_ = '新流程的对应值' WHERE _ID = xxx AND NAME_ = 'source-extra';

后续根据条件,正确提交即可,可以正常流转。

优缺点

  • 优点
    • 新的流程分支可以从流程图上体现,一目了然;
    • 符合工作流的生命周期,正常应用工作流的监听器
    • 全局应用
  • 缺点
    • 修改工作流比较麻烦
    • 如果改动比较多,而且部分流程已经过了 node1 的话,可能会导致实时绘制流程报错。
    • 需要注意新老代码层面的兼容性(前提数据库唯一,但代码蓝绿发布)

应用场景

改动是全局的;
工作流模型改动有良好的版本管理和上线流程;
流程图需要体现这个分支流程(是正常业务应该关心的流转)

SQL修改工作流数据

DELETE FROM act_ru_task  WHERE ID_ = 'xxxx';
DELETE FROM act_ru_variable  WHERE PROC_INST_ID_ = 'xxxx';
DELETE FROM act_ru_execution WHERE ID_ = 'xxxx';
UPDATE act_hi_taskinst SET END_TIME_ = '2023-02-20 21:57:47.033000', DURATION_= 4180506 WHERE ID_ = 'xxxx';
UPDATE act_hi_procinstSET END_TIME_ = '2023-02-20 21:57:47.033000', DURATION_= 4180506, END_ACT_ID_ = 'endevent_oc' WHERE PROC_INST_ID_ = 'xxxx';

优缺点

  • 优点
    • 一次性,不用开发临时性代码
  • 缺点
    • SQL 改动风险高
    • 无法使用工作流层面的监听器
    • 如果存在业务数据修复,需要同时处理

应用场景

一次性流程关闭,无业务数据修复

代码动态修改流程模型

    /**
     * 提前终止业务流程实例,适用场景:当前任务节点没有对应的流程结束节点(业务变更导致需要终止流程)
     */
    public void terminateProcessByBusinessKey(String businessKey) {
        taskService.createTaskQuery()
                .processInstanceBusinessKey(businessKey)
                .list()
                .forEach(task -> terminateProcessByTask(task.getId(), task));
    }

    private void terminateProcessByTask(String taskId, Task task) {
        if (Objects.isNull(task)) {
            log.warn("流程任务实例不存在. taskId: {}", taskId);
            return;
        }
        BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());

        EndEvent endEvent = bpmnModel.getMainProcess().findFlowElementsOfType(EndEvent.class).get(0);
        FlowNode currentNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(task.getTaskDefinitionKey());
        List<SequenceFlow> orignOutgoingFlows = currentNode.getOutgoingFlows();

        SequenceFlow endFlow = new SequenceFlow();
        endFlow.setId("flow_to_temp_end");
        endFlow.setSourceFlowElement(currentNode);
        endFlow.setTargetFlowElement(endEvent);
        // 将当前节点的出向分支替换为流向 flow_to_temp_end
        currentNode.setOutgoingFlows(Lists.newArrayList(endFlow));
        taskService.complete(taskId);
        // 流转完恢复
        currentNode.setOutgoingFlows(orignOutgoingFlows);
        log.info("非正常方式完成流程. taskId: {},procDefKey: {},caseNo:{}", taskId, bpmnModel.getMainProcess().getId(), task.getBusinessKey());
    }

图例:在这里插入图片描述

优缺点

  • 优点
    • 通用的非正常关闭逻辑,不受限于某个节点
    • 可以应用工作流的生命周期,不影响事件触发或监听器
    • 可以便于处理业务数据的非正常结束
  • 缺点
    • 模型的改动是全局的,注意并发
    • 无法体现在流程图上
    • 实时流程图的生成会有影响

应用场景

  • 不仅限于一个节点的流程关闭
  • 业务不强要求流程关闭的分支体现在图上
  • 短期方案,逐步替换为正常流程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/435745.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于 JESD204B 协议ARM+FPGA+AD多板卡多通道同步采集实现方法

0 引言 随着数字化信号处理技术的不断进步&#xff0c;对数字信号 的处理已经成为当前大多数工程应用的基本方法。由于 模拟信号才是现实生活中的原始信号&#xff0c;为了工程研究实 现的可能&#xff0c;需将模拟信号转换为数字信号才能在工程中 处理&#xff0c;AD 转换…

独立按键控制LED移位

1.这就是LED移位的原理 2. #include <REGX52.H> void Delay(unsigned int xms);unsigned char LEDNum;//LEDNum为0000 0000void main() {P2~0x01; //上电默认LED1点亮while(1){if(P3_10) //如果K1按键按下&#xff0c;LED灯往右依次亮起{Delay(20);while(P3_10);//消…

Bandizip已管理员身份运行

系列文章目录 文章目录 系列文章目录前言一、Bandzib是什么&#xff1f;二、使用步骤1.引入库 前言 在解压krita源码包时Bandizip报错 一、Bandzib是什么&#xff1f; bandzip官网 Bandizip 是一款压缩软件&#xff0c;它支持Zip、7-Zip 和 RAR 以及其它压缩格式。它拥有非…

【22岁,想转行IT,请问培训出来真的能找到工作吗?】

首先需要肯定的是&#xff0c;22岁是一个转行IT的好时间&#xff0c;大概猜想你是大学应届生吧&#xff0c;学历和年龄都是IT企业们非常喜欢的&#xff0c;这个时候如果你刚好有一身过硬的专业技能&#xff0c;那就非常完美了。那么你现在想转行学习&#xff0c;目前对于IT行业…

SpringBoot 整合 ChatGPT API 项目实战

SpringBoot 整合 ChatGPT API 项目实战 一、准备工作 二、补全接口示例 三、申请API-KEY 四、JavaScript调用API 五、SpringBoot使用ChatGPT API 体验到了ChatGPT的强大之后&#xff0c;那么我们会想&#xff0c;如果我们想基于ChatGPT开发一个自己的聊天机器人&#xff0…

计算机网络复习记录(总结 —— 快速入门和快速复习)

一、计算机网络的定义和分类 定义&#xff1a; 简单定义&#xff1a;一些互连、自治、的计算机集合。 较好定义&#xff1a;计算机网络主要是由一些通用的、可编程的硬件互连而成&#xff0c;而这些硬件并非专门用来实现某一特定目的。 分类 按交换技术分类 按使用者分类 …

【工作思考】如何提升自己的编程能力?

文章目录 前言一、代码评审为什么要进行代码评审&#xff1f; 二、持续学习能力三、良好的编程习惯代码注释避免深度嵌套拒绝长函数重视自测文档编写重构你的代码学会思考 四、多接触开源项目五、总结 前言 在工作中&#xff0c;我们大部分的时间都是在阅读代码&#xff0c;阅…

CF204A-Little Elephant and Interval(数位)

CF204A-Little Elephant and Interval 考虑 [ 1 , a b c d e ‾ ] [1,\overline{abcde}] [1,abcde] 的情况&#xff1a; 位置集合数量个位1 ~ 99十位11 ~ 999百位 { x u x ‾ ∣ x ∈ [ 1 , 9 ] , u ∈ [ 0 , 9 ] } \{\overline{xux} | x\in [1,9],u\in [0,9]\} {xux∣x∈[1…

基于Yolov5的二维码QR码识别

1.QR code介绍 一个 QR 码可以分为两个部分&#xff1a;功能图形和编码区域。 数据集 大小10,85张 1.1 通过split_train_val.py得到trainval.txt、val.txt、test.txt # coding:utf-8import os import random import argparseparser argparse.ArgumentParser() #xml文件的地…

设计模式-结构型模式之代理模式

6. 代理模式 6.1. 模式动机 在某些情况下&#xff0c;一个客户不想或者不能直接引用一个对 象&#xff0c;此时可以通过一个称之为“代理”的第三者来实现 间接引用。代理对象可以在客户端和目标对象之间起到 中介的作用&#xff0c;并且可以通过代理对象去掉客户不能看到 的内…

江苏专转本盐城工学院管理学章节习题

江苏专转本盐城工学院管理学章节习题第一章 管理活动与管理理论 一、单项选择题 1.企业在销售产品时,需要预估货款回收的可能性。为此&#xff0c;信用审核部门力图以一种低成本的方式处理有关客户资信的材料,但因为过程速度太慢,使许多客户另求他处购货。该项信用审核工作可…

Power Automate实现自动填充Word

创建Word模板 1、创建一个Word&#xff0c;按需求写好内容 2、在需要填充的地方插入开发工具-纯文本内容控件 3、编辑控件属性&#xff0c;用于Power Automate中区分字段 4、模板完成后上传至Sharepoint站点中 创建Forms 也可使用Sharepoint列表作申请单&#xff0c;这步就…

实战:快速实现iOS应用中集成即时通讯IM和UI

准备 熟练objective-c语言 有一台mac电脑,并安装了xcode 和 cocoapods 目标 手把手教大家在iOS应用中集成即时通讯IM 功能 内容篇幅较长,需要内心平和耐心看下去,务必戒躁.阅读本文并按照本文进行对接预计时长2小时 注册Appkey和username 本教程以集成环信IM为例 注册环信…

SpringBoot 整合 ES (四十二)

我看到希望&#xff0c;哪怕只有微小的一束光&#xff0c;我也会拼尽全力去寻找 上一章简单介绍了 SpringBoot 整合 RabbitMQ (四十一), 如果没有看过,请观看上一章 ES 相应的教程&#xff0c;可以看老蝴蝶之前写的文章: https://blog.csdn.net/yjltx1234csdn/category_122775…

Java 基础常识

一、Java运行机制 1.Java运行原理 编译&#xff1a;.java(源代码) ---> .class(字节码) 解释&#xff1a;.class(字节码) ---> 加载并启动JVM(类加载) ---> .class(机器指令) 执行&#xff1a;通过JVM来完成运行输出 2.Java运行过程 利用 javac 编译 .java 文件 利…

欧姆龙CP1H系列PLC通讯扩展与数据采集

一、应用场景 纺织厂的粗纱机&#xff0c;控制系统由1台欧姆龙CP1H的PLC和1台昆仑通泰MCGS的触摸屏组成&#xff0c;触摸屏连接到PLC通讯扩展的接口CP1W-CIF01&#xff08;RS232串行通讯&#xff09;。现在MES管理系统&#xff0c;需要采集设备的数据&#xff0c;要求不改变原来…

【详解C++中的引用】

文章目录 一、什么是引用二、引用规则三、引用特性四、使用场景1.做函数参数2.做返回值五、常引用 ps&#xff1a;为什么类型转换会产生临时变量&#xff1f; 六、引用和指针的区别总结 一、什么是引用 引用就是给一个变量取别名。 注意&#xff1a;这个引用不会新开辟一块空…

微信小程序自定义组件:组件间通讯

前言 略 组件间通信 组件间的基本通信方式有以下几种&#xff1a; WXML 数据绑定&#xff1a;用于父组件向子组件的指定属性设置数据&#xff0c;仅能设置 JSON 兼容数据&#xff08;自基础库版本 2.0.9 开始&#xff0c;还可以在数据中包含函数&#xff09;。具体在 组件模…

Mybatis-plus 两种分页方法(分单表和联表)

mybatis-plus分别使用 一、PageHelper插件分页使用 准备1&#xff1a;引入PageHelper依赖 <!-- pagehelper 分页插件 --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId>…

面试高频代码题

文章目录 链表1.删除有序链表中的重复链表2.删除有序链表的重复数组并只保留只出现过一次的结点3. 无序单链表升序排列 数组1. 冒泡排序2. 折半查找3. 快排4.给1001个数&#xff0c;有一个是重复的&#xff0c;如何不使用额外空间找出来这个数&#xff1f;&#xff08;微软&…