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

Activiti 中各种 startProcessInstance 接口之间的区别

前言

在用 RuntimeService 接口启动流程实例时,总是分不清楚不同 startProcessInstanceXXX 接口之间的区别,这篇文章基于 Activiti 7.0.0.GA 版本,对这一类接口进行一个梳理和归类。

详解

接口列表

RuntimeService 接口中以 startProcessInstance 开头的所有方法如下,共计 20 个。

ProcessInstance startProcessInstanceByKey(String processDefinitionKey);ProcessInstance startProcessInstanceByKey(String processDefinitionKey, String businessKey);ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, Object> variables);ProcessInstance startProcessInstanceByKey(String processDefinitionKey, String businessKey, Map<String, Object> variables);ProcessInstance startProcessInstanceByKeyAndTenantId(String processDefinitionKey, String tenantId);ProcessInstance startProcessInstanceByKeyAndTenantId(String processDefinitionKey, String businessKey, String tenantId);ProcessInstance startProcessInstanceByKeyAndTenantId(String processDefinitionKey, Map<String, Object> variables, String tenantId);ProcessInstance startProcessInstanceByKeyAndTenantId(String processDefinitionKey, String businessKey, Map<String, Object> variables, String tenantId);ProcessInstance startProcessInstanceById(String processDefinitionId);ProcessInstance startProcessInstanceById(String processDefinitionId, String businessKey);ProcessInstance startProcessInstanceById(String processDefinitionId, Map<String, Object> variables);ProcessInstance startProcessInstanceById(String processDefinitionId, String businessKey, Map<String, Object> variables);ProcessInstance startProcessInstanceByMessage(String messageName);ProcessInstance startProcessInstanceByMessageAndTenantId(String messageName, String tenantId);ProcessInstance startProcessInstanceByMessage(String messageName, String businessKey);ProcessInstance startProcessInstanceByMessageAndTenantId(String messageName, String businessKey, String tenantId);ProcessInstance startProcessInstanceByMessage(String messageName, Map<String, Object> processVariables);ProcessInstance startProcessInstanceByMessageAndTenantId(String messageName, Map<String, Object> processVariables, String tenantId);ProcessInstance startProcessInstanceByMessage(String messageName, String businessKey, Map<String, Object> processVariables);ProcessInstance startProcessInstanceByMessageAndTenantId(String messageName, String businessKey, Map<String, Object> processVariables, String tenantId);

分类

分析以上接口,虽接口种类繁多,但总体可按以下几种方式划分归类。

按启动类型分类

按启动类型分类,可分为三类,分别是:

按可传变量

按接口是否可传变量划分,可分为两类,分别是:

按接口名称

按相同接口名称分类(含重载),可分为 5 类 ,分别是:

按内外业务键

按内外业务键划分,可分为两类,分别是:

按租户类型

按租户类型划分,分为单租户和多租户两类,分别是:

知识点

processDefinitionKey 和 processDefinitionId 有什么区别?
processDefinitionKey 是我们在创建流程模型时定义的,而 processDefinitionId 是在流程后得到的。
假设定义一个 multi-product-manage.bpmn20.xml 流程模型文件,processDefinitionKey 是 multi-product-manage-k, 对这个流程模型文件部署三次,得到的 processDefinitionId 分别是:
  1. multi-product-manage-k:1:805003
  2. multi-product-manage-k:2:815003
  3. multi-product-manage-k:3:825003
在同一个 bpmn20.xml 文件被部署多个版本的情况下,如果以 processDefinitionKey(在这里取值 multi-product-manage-k)启动流程实例,Activiti 会选择最新部署的版本来启动流程实例,也就是会以 product-manage-k:3:825003 的这个版本来启动流程实例,不会去采用 multi-product-manage-k:1:805003 或者 multi-product-manage-k:2:815003 启动流程。如果以 processDefinitionId 来启动,传入 multi-product-manage-k:1:805003,Activiti 就会按照我们指定的版本来启动流程实例。
这个就是 processDefinitionKey 和 processDefinitionId 的最大区别。
举例
processDefinitionKey 举例。打开 Activiti Editor 流程模型编辑页面,创建一个流程模型,需要我们输入 model name 和 model key,以及 description。其中的 model key 就是 processDefinitionKey。
processDefinitionId 举例。processDefinitionId 由 processDefinitionKey + 部署次数 + 数字组成,格式为:
processDefinitionKey:部署次数:数字
对生成的 multi-product-manage.bpmn20.xml 流程模型文件进行部署。
第一次部署,得到的 processDefinitionId 如下
第二次部署,得到的 processDefinitionId 如下
仔细观察可发现,部署次数会随着同一个 bpmn20.xml 文件的部署而递增。由此 部署次数 数字就可以看出某个 bpmn20.xml 文件被部署了多少次。
startProcessInstance 中 bussinessKey 的应用场景
提示:应用场景由 deepseek 生成
businessKey在Activiti工作流引擎中是一个重要的概念,它用于将业务流程实例与业务数据关联起来。以下是两个典型的应用示例:
示例1:订单审批流程
假设我们有一个订单审批流程,需要将工作流与具体的订单关联:
// 启动流程时关联业务键
Order order = orderService.createOrder(); // 创建订单业务对象
String businessKey = "ORDER_" + order.getId(); // 构建业务键// 启动流程实例并关联业务键
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("orderApprovalProcess", businessKey,variables
);// 通过业务键查询流程实例
ProcessInstance instance = runtimeService.createProcessInstanceQuery().processInstanceBusinessKey(businessKey).singleResult();// 在用户任务中获取业务键
Task task = taskService.createTaskQuery().processInstanceBusinessKey(businessKey).singleResult();
这样,在流程的任何环节,我们都能通过订单ID(业务键)快速找到对应的流程实例,实现业务数据与流程的关联。
示例2:请假申请流程
另一个常见场景是员工请假申请流程:
// 员工提交请假申请
LeaveApplication leave = new LeaveApplication();
leave.setEmployeeId("EMP1001");
leave.setDays(3);
leave.setReason("家庭事务");
leaveApplicationService.save(leave);// 使用请假单ID作为业务键启动流程
String businessKey = "LEAVE_" + leave.getId();
Map<String, Object> variables = new HashMap<>();
variables.put("applicant", leave.getEmployeeId());
variables.put("days", leave.getDays());runtimeService.startProcessInstanceByKey("leaveApprovalProcess", businessKey, variables
);// 经理审批时通过业务键获取请假单信息
List<Task> tasks = taskService.createTaskQuery().taskAssignee("manager1").list();for (Task task : tasks) {String bk = task.getBusinessKey();String leaveId = bk.replace("LEAVE_", "");LeaveApplication application = leaveApplicationService.findById(leaveId);// 显示审批页面...
}
通过businessKey,审批人可以快速获取关联的请假单详细信息,审批完成后也能方便地更新业务数据状态。
businessKey的主要作用:
  1. 建立业务流程与业务数据的关联
  2. 方便通过业务ID查询流程状态
  3. 在流程处理中快速定位业务数据
  4. 实现业务数据和流程数据的松耦合关联
在实际应用中,businessKey通常采用"业务类型_业务ID"的格式,如"ORDER_123"、"LEAVE_456"等,以确保唯一性和可读性。
http://www.xdnf.cn/news/17355.html

相关文章:

  • Java——详解形参实参方法的重载
  • .NET PDF处理组件IronPDF:如何通过 AI 简化开发人员处理 PDF的方式
  • platform总线简介和使用场景说明
  • 设计模式-装饰模式 Java
  • Web开发-JS应用WebPack构建打包Mode映射DevTool源码泄漏识别还原
  • [激光原理与应用-169]:测量仪器 - 能量型 - 光功率计(功率稳定性监测)
  • RepoCoder:仓库级代码补全的迭代检索生成框架解析与应用前沿
  • 基于Python+Vue+Mysql实现(物联网)智能大棚
  • 【tips】css模仿矢量图透明背景
  • Vue 3 入门教程 9 - 表单处理
  • change和watch
  • 酉矩阵(Unitary Matrix)和随机矩阵
  • 拥抱云原生:从传统架构到云原生架构的演进与实践
  • 慢SQL优化实战:从一例线上慢SQL探究执行引擎工作过程
  • 如何快速掌握Excel公式?14天轻松通关
  • 大疆前端笔试题目详解
  • Kafka数据生产和发送
  • 如何将Dubbo从Zookeeper平滑地迁移到Nacos?
  • OpenCV图像处理入门实战指南
  • 【办公自动化】使用Python来自动化处理Excel表格有哪些方法?
  • 急危重症专科智能体”构建新一代急诊、手术与重症中心的AI医疗方向探析
  • 图像认知与OpenCV——图像预处理4
  • Java并发与数据库锁机制:悲观锁、乐观锁、隐式锁与显式锁
  • NFS 服务器与iSCSI 服务器
  • 安卓系统属性之androidboot.xxx转换成ro.boot.xxx
  • PostgreSQL 强制索引:当重复数据让优化器“失明”时的解决方案
  • 对话访谈|盘古信息×冠捷科技:全球制造标杆的智能化密码
  • 2025 年华数杯全国大学生数学建模竞赛C 题 可调控生物节律的 LED 光源研究--完整成品、思路、模型、代码、结果分享
  • 本地组策略编辑器无法打开(gpedit.msc命令异常)
  • Windows中安装rustup-init.exe以及cargo build报错443