当前位置: 首页 > news >正文

Activiti(五)- 工作流引擎中流程定义删除机制

1、引言

Activiti作为一款轻量级、开源的工作流和业务流程管理(BPM)平台,在实际运维过程中,随着业务发展会产生大量需要清理的流程定义,不规范的删除操作可能导致数据不一致或系统异常等问题。本文将介绍Activiti中删除流程定义的相关方式及其适用场景。

2、通过RepositoryService删除流程定义

RepositoryService是Activiti中管理流程定义和部署的核心服务,提供了多种删除流程定义的方法。

2.1、根据部署ID删除

@Service
public class ProcessDefinitionsServiceImpl implements ProcessDefinitionsService {

    private final static Logger logger = LoggerFactory.getLogger(ProcessDefinitionsServiceImpl.class);

    @Autowired
    private RepositoryService repositoryService;

    @Override
    public AjaxResult deleteProcessByDeploymentId(String deploymentId) {
        logger.info("delete start ***!");
        repositoryService.deleteDeployment(deploymentId);
        logger.info("delete end ***!");
        return AjaxResult.success("删除成功!");
    }
}
2.1.1、这种方式会删除指定deploymentId的整个部署,包括该部署下的所有流程定义。这是最直接的删除方式,但需要注意以下两点:
①如果该部署下的流程定义已经启动了流程实例,默认会删除失败
②可以通过添加级联参数来删除相关的流程实例
2.1.2、操作涉及表如下所示:
数据表说明执行语句
ACT_GE_BYTEARRAY存储字节数组数据delete from ACT_GE_BYTEARRAY where DEPLOYMENT_ID_ = ?
ACT_RE_DEPLOYMENT存储部署信息delete from ACT_RE_DEPLOYMENT where ID_ = ?
ACT_RU_EVENT_SUBSCR存储事件订阅信息delete from ACT_RU_EVENT_SUBSCR where PROC_DEF_ID_ = ? and EXECUTION_ID_ is null and PROC_INST_ID_ is null
ACT_RU_IDENTITYLINK存储运行时的用户组、用户和任务之间的关联信息。delete from ACT_RU_IDENTITYLINK where PROC_DEF_ID_ = ?
ACT_RE_PROCDEF存储流程定义信息delete from ACT_RE_PROCDEF where DEPLOYMENT_ID_ = ?

2.2、 级联删除部署及实例

@Service
public class ProcessDefinitionsServiceImpl implements ProcessDefinitionsService {

    private final static Logger logger = LoggerFactory.getLogger(ProcessDefinitionsServiceImpl.class);

    @Autowired
    private RepositoryService repositoryService;

    @Override
    public AjaxResult deleteProcessByDeploymentId(String deploymentId) {
        logger.info("delete start ***!");
        repositoryService.deleteDeployment(deploymentId, true);
        logger.info("delete end ***!");
        return AjaxResult.success("删除成功!");
    }
}
添加第二个参数为true时,会级联删除该部署相关的所有流程实例、任务和历史数据。适用于需要彻底清理的场景,但生产环境需谨慎使用。

2.3、基础删除方法对比

方法签名级联删除适用场景
deleteDeployment(String deploymentId)×没有流程实例的流程定义
deleteDeployment(String deploymentId, boolean cascade)有流程实例的流程定义

3、通过流程定义ID删除

Activiti不直接支持通过流程定义ID删除,因为流程定义属于某个部署。但可以通过以下方式间接实现:
@Service
public class ProcessDefinitionsServiceImpl implements ProcessDefinitionsService {

    private final static Logger logger = LoggerFactory.getLogger(ProcessDefinitionsServiceImpl.class);

    @Autowired
    private RepositoryService repositoryService;

    @Override
    public AjaxResult deleteProcessByDeploymentId(String processDefinitionId) {
        // 先获取流程定义
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
                .processDefinitionId(processDefinitionId)
                .singleResult();
        // 再通过部署ID删除
        repositoryService.deleteDeployment(processDefinition.getDeploymentId(), true);
        return AjaxResult.success("删除成功!");
    }
}

4、批量删除流程定义

对于需要批量删除的场景,可以通过查询后循环删除:
@Service
public class ProcessDefinitionsServiceImpl implements ProcessDefinitionsService {

    private final static Logger logger = LoggerFactory.getLogger(ProcessDefinitionsServiceImpl.class);

    @Autowired
    private RepositoryService repositoryService;

    @Override
    public AjaxResult deleteProcessByDeploymentId() {
        // 先获取流程定义
        List<ProcessDefinition> definitions = repositoryService.createProcessDefinitionQuery()
                .list();
        // 再通过部署ID删除
        for (ProcessDefinition pd : definitions) {
            repositoryService.deleteDeployment(pd.getDeploymentId(), true);
        }
        return AjaxResult.success("删除成功!");
    }

5、替代删除的方案

在某些场景下,可以考虑以下替代方案而非直接删除:

5.1、挂起流程定义:使其不可启动新实例但不影响现有实例

@Service
public class ProcessDefinitionsServiceImpl implements ProcessDefinitionsService {

    private final static Logger logger = LoggerFactory.getLogger(ProcessDefinitionsServiceImpl.class);

    @Autowired
    private RepositoryService repositoryService;

    @Override
    public AjaxResult deleteProcessByDeploymentId(String processDefinitionId) {
        repositoryService.suspendProcessDefinitionById(processDefinitionId);
        return AjaxResult.success();
    }
}

5.2、版本控制:部署新版本并停用旧版本

相关文章:

  • K8s常用基础管理命令(一)
  • PPT模板之--个人简历
  • 安全序列(DP)
  • IO流——字符输入输出流:FileReader FileWriter
  • 【服务器端表单字符验证】
  • 若依前后端分离版之使用Swagger
  • 解决unity设置鼠标图标发布以后没有效果的问题
  • 一维差分数组
  • 【AI提示词】长期主义助手提供规划支持
  • MySQL查看binlog执行情况
  • 【C++初学】C++核心编程技术详解(二):类与继承
  • 51单片机烧录程序演示教程
  • 从零开始搭建一个 Vue 3 + Vite 的项目
  • Web实现权限控制的原理
  • DDR管脚违例
  • 大模型Agent炼金术:优化路径与未来方向
  • Linux 系统中从源码编译安装软件
  • 亚洲区域健康人群免疫细胞marker
  • golang 采用use-go/onvif获取RTSP流
  • 【有效】运行Anaconda Navigator报错:This application failed to start no Qt的解决办法
  • 商业网站设计的基本原则/爱战网官网
  • 建设邮费自己的网站 要不要购买服务器的/天津疫情最新情况
  • 安全证四川省建设厅官方网站/网页搜索引擎大全
  • 百度网站是怎么做的/app拉新任务平台
  • 企业网站建设分析/电商推广平台
  • 深圳设计网站费用/谷歌搜索入口