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

Activiti(六)- 启动、挂起、激活,查询及删除流程实例

1、引言

Activiti作为一款轻量级、开源的工作流和业务流程管理(BPM)平台。流程实例(Process Instance) 是 Activiti 核心运行机制的重要组成部分,代表了一个具体的业务流程从启动到结束的整个生命周期,本文将介绍关于activiti中关于启动、挂起、激活,查询及删除流程实例的方式。

2、启动流程实例

Activiti提供了多种启动流程实例的方式,主要通过RuntimeService、ProcessRuntime等接口实现。

2.1、ProcessInstanceBuilder的使用

ProcessInstanceBuilder是Activiti提供的一种灵活的流程实例构建方式,采用建造者模式(Builder Pattern),可以链式调用设置各种参数。
2.1.1、基本使用如下:
@RestController
@RequestMapping("/process")
public class StartUpProcess {@Autowiredprivate RuntimeService runtimeService;@Autowiredprivate TaskService taskService;@GetMapping(value = "/start")public AjaxResult startProcess() {List<String> assigneeList = new ArrayList<>();assigneeList.add("admin");ProcessInstance instance = runtimeService.createProcessInstanceBuilder().processDefinitionKey("Test-Process") // 设置流程定义Key.variable("assigneeList", assigneeList) / 设置流程变量.start();// 调试:查询生成的任务List<Task> tasks = taskService.createTaskQuery().processInstanceId(instance.getId()).list();tasks.forEach(task -> {System.out.println("任务ID: " + task.getId() + ", 处理人: " + task.getAssignee());});return AjaxResult.success("下发成功!");}
}
2.1.2、主要方法说明(见源码:ProcessInstanceBuilder
方法说明使用场景
processDefinitionKey(String processDefinitionKey);通过 流程定义Key 启动流程较为通用方式
processDefinitionId(String processDefinitionId);通过 流程定义ID 启动流程(精确匹配)明确知道流程定义的唯一ID时使用(
messageName(String messageName);通过 消息名称 启动流程(需配合消息启动事件)BPMN 中定义了 <startEvent activiti:messageName="***"> 时使用
name(String processInstanceName);设置流程实例的 显示名称(非业务标识).-
businessKey(String businessKey);设置流程实例的 业务键(用于业务关联)-
tenantId(String tenantId)指定 租户ID(多租户隔离)确保 tenantId 与流程定义的租户一致
variables(Map<String, Object> variables);设置 持久化变量(存入数据库)-
variable(String variableName, Object value);设置 持久化变量(存入数据库)-
transientVariables(Map<String, Object> transientVariables);设置 临时变量(不存库,仅启动阶段有效)-
transientVariable(String variableName, Object value);设置 临时变量(不存库,仅启动阶段有效)-
start();执行流程启动操作-

2.2、 startProcess系列方法(见源码:RuntimeService

2.2.1、按流程定义Key启动
    public void startProcess() {// 最基本方式 - 仅指定流程KeyProcessInstance instance1 = runtimeService.startProcessInstanceByKey("Test-Process");// 带业务Key启动ProcessInstance instance2 = runtimeService.startProcessInstanceByKey("Test-Process", "20250413");// 带变量启动Map<String, Object> variables = new HashMap<>();variables.put("assignee", "admin");ProcessInstance instance3 = runtimeService.startProcessInstanceByKey("Test-Process", variables);// 带业务Key和变量启动ProcessInstance instance4 = runtimeService.startProcessInstanceByKey("Test-Process", "20250413", variables);}
2.2.2、 按流程定义ID启动
    public void startProcess() {// 最基本方式 - 仅指定流程IDProcessInstance instance1 = runtimeService.startProcessInstanceById("Test-Process:1:9da64eadfc0946d9ba70606");// 带业务Key启动ProcessInstance instance2 = runtimeService.startProcessInstanceById("Test-Process:1:9da64eadfc0946d9ba70606", "20250413");// 带变量启动Map<String, Object> variables = new HashMap<>();variables.put("assignee", "admin");ProcessInstance instance3 = runtimeService.startProcessInstanceById("Test-Process:1:9da64eadfc0946d9ba70606", variables);// 带业务Key和变量启动ProcessInstance instance4 = runtimeService.startProcessInstanceById("Test-Process:1:9da64eadfc0946d9ba70606", "20250413", variables);}
2.2.3、 按消息启动
    public void startProcess() {// 简单消息启动ProcessInstance instance1 = runtimeService.startProcessInstanceByMessage("MessageTask");// 带业务Key的消息启动ProcessInstance instance2 = runtimeService.startProcessInstanceByMessage("MessageTask", "20250413");// 带变量的消息启动Map<String, Object> variables = new HashMap<>();variables.put("MessageTask", "1000");ProcessInstance instance3 = runtimeService.startProcessInstanceByMessage("MessageTask", variables);// 带业务Key和变量的消息启动ProcessInstance instance4 = runtimeService.startProcessInstanceByMessage("MessageTask", "20250413", variables);}
2.2.4、多租户支持
对于多租户系统,可以使用带tenantId的方法:
public void startProcess() {// 按Key启动,指定租户ProcessInstance instance1 = runtimeService.startProcessInstanceByKeyAndTenantId("Test-Process", "tenant1");// 按消息启动,指定租户ProcessInstance instance2 = runtimeService.startProcessInstanceByMessageAndTenantId("MessageTask", "tenant1");
}

2.3、 ProcessRuntime的start()方法(见源码:ProcessRuntime、ProcessPayloadBuilder

2.3.1、基本使用示例:
public void startProcess() {List<String> assigneeList = new ArrayList<>();assigneeList.add("admin");// 带变量启动Map<String, Object> variables = new HashMap<>();variables.put("assigneeList", assigneeList);ProcessInstance instance = processRuntime.start(ProcessPayloadBuilder.start().withProcessDefinitionKey("Test-Process").withName("测试").withBusinessKey("businessId").withVariables(variables).build());
}

3、挂起流程实例

3.1、挂起特定流程实例

3.1.1、通过runtimeService.suspendProcessInstanceById()实现
    public AjaxResult suspendProcess(){runtimeService.suspendProcessInstanceById("368079dd58c34189a5208c3db269cfa5");return AjaxResult.success();}
3.1.2、通过processRuntime.suspend()实现
public AjaxResult suspendProcess(){processRuntime.suspend(ProcessPayloadBuilder.suspend("368079dd58c34189a5208c3db269cfa5"));// orprocessRuntime.suspend(ProcessPayloadBuilder.suspend().withProcessInstanceId("368079dd58c34189a5208c3db269cfa5").build());return AjaxResult.success();
}

3.2、挂起整个流程定义的所有实例

3.2.1、通过RepositoryService.suspendProcessDefinitionByKey()的方式
    public AjaxResult suspendProcess(){// 挂起整个流程定义(包括所有实例)repositoryService.suspendProcessDefinitionByKey("Test-Process",true,  // 是否挂起所有实例null   // 暂停日期,null表示立即执行);return AjaxResult.success();}
3.2.2、通过RepositoryService.suspendProcessDefinitionByKey()的方式
    public AjaxResult suspendProcess(){// 挂起整个流程定义(包括所有实例)repositoryService.suspendProcessDefinitionById("Test-Process",true,  // 是否挂起所有实例null   // 暂停日期,null表示立即执行);return AjaxResult.success();}

4、激活流程实例

4.1、激活特定流程实例

4.1.1、通过runtimeService.activateProcessInstanceById()实现
    public AjaxResult activateProcess(){runtimeService.activateProcessInstanceById("368079dd58c34189a5208c3db269cfa5");
//        ACT_RU_TASK   ACT_RU_EXECUTIONreturn AjaxResult.success();}
4.1.2、通过processRuntime.resume()实现
public AjaxResult activateProcess(){processRuntime.resume(ProcessPayloadBuilder.resume("368079dd58c34189a5208c3db269cfa5"));	// orprocessRuntime.resume(ProcessPayloadBuilder.resume().withProcessInstanceId("368079dd58c34189a5208c3db269cfa5").build());
//        ACT_RU_TASK   ACT_RU_EXECUTIONreturn AjaxResult.success();
}

4.2、挂起整个流程定义的所有实例

4.2.1、通过RepositoryService.activateProcessDefinitionByKey()的方式
    public AjaxResult activateProcess(){repositoryService.activateProcessDefinitionByKey("Test-Process",true,  // 是否激活所有实例null   // 激活日期,null表示立即执行);return AjaxResult.success();}
4.2.2、通过RepositoryService.activateProcessDefinitionById()的方式
    public AjaxResult activateProcess(){repositoryService.activateProcessDefinitionById("Test-Process",true,  // 是否激活所有实例null   // 激活日期,null表示立即执行);return AjaxResult.success();}

5、查询流程实例

通过 RuntimeService 和 HistoryService 进行查询

5.1、查询运行时实例

5.1.1、基本使用实例:
    public AjaxResult queryInstance(){List<ProcessInstance> list = runtimeService.createProcessInstanceQuery().list();for (ProcessInstance pd : list) {try {StringBuilder sb = new StringBuilder();for (Field field : pd.getClass().getDeclaredFields()) {field.setAccessible(true);sb.append(field.getName()).append("=").append(field.get(pd)).append(", ");}logger.info("反射字段值: {}", sb.toString());} catch (Exception e) {logger.error("反射读取失败", e);}}return AjaxResult.success();}
5.1.2、主要方法说明(见源码:ProcessInstanceQuery
分类方法说明示例
基础查询processInstanceId(String)按流程实例ID查询.processInstanceId(“123”)
processInstanceBusinessKey(String)按业务键查询.processInstanceBusinessKey(“ORDER_001”)
processDefinitionKey(String)按流程定义Key查询.processDefinitionKey(“leaveProcess”)
状态筛选suspended()查询已挂起的流程实例.suspended()
active()查询活跃的流程实例.active()
时间范围startedAfter(Date)查询指定时间之后启动的实例.startedAfter(new Date(startTime))
startedBefore(Date)查询指定时间之前启动的实例.startedBefore(new Date(endTime))
变量条件variableValueEquals(String, Object)查询变量等于特定值的实例.variableValueEquals(“status”, “approved”)
variableValueNotEquals(String, Object)查询变量不等于特定值的实例.variableValueNotEquals(“priority”, 1)
variableValueGreaterThan(String, Object)查询变量值大于特定值的实例.variableValueGreaterThan(“amount”, 1000)
排序方法orderByProcessInstanceId().desc()按实例ID降序排列.orderByProcessInstanceId().desc()
orderByProcessDefinitionKey().asc()按流程定义Key升序排列.orderByProcessDefinitionKey().asc()
分页/计数listPage(int firstResult, int maxResults)分页查询.listPage(0, 10) // 第1页,每页10条
count()计数查询.processDefinitionKey(“order”).count()
高级查询includeProcessVariables()结果包含流程变量.includeProcessVariables().list()
processInstanceTenantId(String)按租户ID查询.processInstanceTenantId(“tenant1”)
or()…endOr()逻辑OR条件组合.or().processDefinitionKey(“p1”).processDefinitionKey(“p2”).endOr()
实用场景involvedUser(String)查询用户参与的流程实例.involvedUser(“user1”).active()
startedBy(String)查询指定用户启动的实例.startedBy(“admin”)
withJobException()查询因作业异常失败的实例.withJobException()

5.2、查询历史实例

5.2.1、基本使用实例:
    public AjaxResult queryInstance(){List<HistoricProcessInstance> list1 = historyService.createHistoricProcessInstanceQuery().list();for (HistoricProcessInstance pd : list1) {try {StringBuilder sb = new StringBuilder();for (Field field : pd.getClass().getDeclaredFields()) {field.setAccessible(true);sb.append(field.getName()).append("=").append(field.get(pd)).append(", ");}logger.info("反射字段值: {}", sb.toString());} catch (Exception e) {logger.error("反射读取失败", e);}}return AjaxResult.success();}
5.1.2、主要方法说明(见源码:HistoricProcessInstanceQuery
分类方法说明示例
基础查询processInstanceId(String)按历史流程实例ID查询.processInstanceId(“123”)
processInstanceBusinessKey(String)按业务键查询.processInstanceBusinessKey(“ORDER_001”)
processDefinitionKey(String)按流程定义Key查询.processDefinitionKey(“leaveProcess”)
状态筛选finished()查询已完成的流程实例.finished()
unfinished()查询未完成的流程实例.unfinished()
deleted()查询已删除的流程实例.deleted()
notDeleted()查询未删除的流程实例.notDeleted()
时间范围startedAfter(Date)查询指定时间之后启动的实例.startedAfter(new Date(startTime))
startedBefore(Date)查询指定时间之前启动的实例.startedBefore(new Date(endTime))
finishedAfter(Date)查询指定时间之后完成的实例.finishedAfter(new Date(completionTime))
finishedBefore(Date)查询指定时间之前完成的实例.finishedBefore(new Date(completionTime))
变量条件variableValueEquals(String, Object)查询结束时有指定变量值的实例.variableValueEquals(“status”, “approved”)
variableValueNotEquals(String, Object)查询结束时变量值不等于指定值的实例.variableValueNotEquals(“priority”, 1)
variableValueGreaterThan(String, Object)查询结束时变量值大于指定值的实例.variableValueGreaterThan(“amount”, 1000)
variableValueLike(String, String)模糊匹配字符串变量值.variableValueLike(“comment”, “%urgent%”)
排序方法orderByProcessInstanceId().desc()按实例ID降序排列.orderByProcessInstanceId().desc()
orderByProcessInstanceStartTime().asc()按启动时间升序排列.orderByProcessInstanceStartTime().asc()
orderByProcessInstanceDuration().desc()按执行时长降序排列.orderByProcessInstanceDuration().desc()
分页/计数listPage(int firstResult, int maxResults)分页查询.listPage(0, 10) // 第1页,每页10条
count()计数查询.processDefinitionKey(“order”).count()
高级查询includeProcessVariables()结果包含流程变量.includeProcessVariables().list()
processInstanceTenantId(String)按租户ID查询.processInstanceTenantId(“tenant1”)
or()…endOr()逻辑OR条件组合.or().processDefinitionKey(“p1”).processDefinitionKey(“p2”).endOr()
withJobException()查询因作业异常失败的实例.withJobException()
实用场景involvedUser(String)查询用户参与的历史流程实例.involvedUser(“user1”)
startedBy(String)查询指定用户启动的实例.startedBy(“admin”)
superProcessInstanceId(String)查询子流程实例.superProcessInstanceId(“parentProcessId”)

6、删除流程实例

通过 RuntimeService 或 ProcessRuntime 进行删除

6.1、使用runtimeService.deleteProcessInstance(String processInstanceId, String deleteReason)

    public AjaxResult deleteInstance(){runtimeService.deleteProcessInstance("368079dd58c34189a5208c3db269cfa5","测试");return AjaxResult.success();}

6.2、使用processRuntime.delete(DeleteProcessPayload deleteProcessPayload)

public AjaxResult deleteInstance(){processRuntime.delete(ProcessPayloadBuilder.delete("368079dd58c34189a5208c3db269cfa5"));//orprocessRuntime.delete(ProcessPayloadBuilder.delete().withProcessInstanceId("368079dd58c34189a5208c3db269cfa5").build());return AjaxResult.success();
}

http://www.mrgr.cn/news/98333.html

相关文章:

  • 关于 驱动开发方法 的详细分类、核心特点及对比分析,涵盖 TDD、MDD、BDD、DDD、ATDD、FDD、PDD 等主流方法
  • EMMOE:开放环境中具身移动操控的综合基准
  • C 语言中经典的数据结构
  • 【数据结构_5】链表(模拟实现以及leetcode上链表相关的题目)
  • 一种基于学习的多尺度方法及其在非弹性碰撞问题中的应用·
  • 【深度学习】PyTorch实现VGG16模型及网络层数学原理
  • Python 数组里找出子超集
  • 【数据结构_4下篇】链表
  • 【数据结构_6上篇】有关链表的oj题
  • 14、nRF52xx蓝牙学习(串口 UART 和 UARTE 外设应用)
  • 【数据结构_4】顺序表
  • linux多线(进)程编程——(6)共享内存
  • 【前端工程化】-【vue2-ele项目升级】
  • 深度学习ResNet模型提取影响特征
  • 【数据结构_6下篇】有关链表的oj题
  • C语言打印的坑
  • 【玩转全栈】—— Django 连接 vue3 保姆级教程,前后端分离式项目2025年4月最新!!!
  • 个人博客系统后端 - 注册登录功能实现指南
  • 行星际激波在日球层中的传播:Propagation of Interplanetary Shocks in the Heliosphere (第二部分)
  • linux多线(进)程编程——(5)虚拟内存与内存映射