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.pswp.cn/web/92354.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92354.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92354.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

新手BUG:函數中 static 變量的賦值語句只會執行一次

在 C 函數中使用 static 變量時&#xff0c;很多新手會陷入一個認知誤區&#xff1a;認為變量的初始化語句會在每次函數調用時執行。比如在bool funcA() { // Q&#xff1a;多次調用funcA&#xff0c;funcB會被執行幾次&#xff1f;// A&#xff1a;1次static bool value func…

Python 基礎詳解:數據類型(Data Types)—— 程序的“數據基石”

一、引言&#xff1a;為什么數據類型如此重要&#xff1f;在 Python 編程中&#xff0c;數據類型決定了&#xff1a;數據的存儲方式可以對數據執行的操作數據的取值范圍不同類型之間的運算規則理解數據類型是編寫正確、高效程序的基礎。Python 是動態類型語言&#xff0c;雖然你…

WindowsLinux系統 安裝 CUDA 和 cuDNN

Windows安裝前的準備工作 檢查硬件兼容性&#xff1a;確認電腦顯卡為 NVIDIA GPU。通過快捷鍵 Win R 喚出“運行”&#xff0c;輸入“control /name Microsoft.DeviceManager”喚出“設備管理器”&#xff0c;點擊“顯示適配器”查看是否有 NVIDIA 字樣。 驗證 CUDA 支持性&a…

工業數采引擎-通信鏈路SOCKET

通信庫&#xff1a;DotNetty 封裝實現&#xff1a;TcpServer、TcpClient、Udp TCP協議特性&#xff1a;面向連接協議&#xff1b;每個新連接都會創建獨立的ChannelHandler實例&#xff1b;TcpHandler構造函數在每次客戶端連接時觸發 UDP協議特性&#xff1a;無連接協議&#…

PHP小白零基礎入門(附視頻教程)

概述 PHP是一種通用開源腳本語言&#xff0c;常用于服務器端Web開發&#xff0c;具有語法簡單、上手快等特點。視頻教程&#xff1a;https://pan.quark.cn/s/8f214c23301b 搭建開發環境&#xff1a; 選擇集成工具&#xff1a;可選擇XAMPP&#xff08;支持Windows/Mac/Linux…

驗證碼等待時間技術在酒店自助入住、美容自助與社區場景中的應用必要性研究—仙盟創夢IDE

代碼 代碼 完整<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>驗證碼倒計時</title><s…

Flask從入門到實戰:基礎、進階、項目架構與接口測試

本文將帶你從零開始掌握Flask框架&#xff0c;涵蓋基礎使用、進階技巧、項目架構設計&#xff0c;并提供完整的接口測試客戶端代碼。 目錄一、Flask基礎入門1.1 Flask簡介與安裝1.2 第一個Flask應用1.3 路由與請求處理1.4 請求與響應處理二、Flask進階使用2.1 模板引擎Jinja22.…

華為云產品圖解

框架圖核心說明: 1. 分層邏輯清晰 基礎設施層(IaaS):提供最基礎的計算(ECS/BMS)、存儲(OBS/EVS)、網絡(VPC/CDN)資源,是所有上層服務的 “物理底座”。 平臺服務層(PaaS):基于 IaaS 構建,提供容器編排(CCE)、數據庫(GaussDB)、大數據與 AI(ModelArts)、中…

Git 中如何回退到以前的提交記錄?

回答重點要在 Git 中回退到以前的提交記錄&#xff0c;你可以使用 git reset 命令。這個命令有三個常用選項來控制你想要回退的程度&#xff1a;1&#xff09; git reset --soft <commit> &#xff1a;僅修改 HEAD 指針&#xff0c;不修改索引和工作區內容。2&#xff09…

JavaWeb03——基礎標簽及樣式(表單)(黑馬視頻筆記)

1.表單標簽 及 表單屬性表單標簽是 &#xff1a;<form> 表單屬性有&#xff1a;action 和 method&#xff1b;action屬性&#xff1a;規定向何處發送表單數據。method屬性&#xff1a;規定用什么方法發送數據。&#xff08;get和post&#xff09;get:在發送的url后面拼接…

STM32的SPI通信(軟件讀寫W25Q64)

在了解完I2C通信后&#xff0c;不免會接觸到到SPI通信。而一開始&#xff0c;可能會覺得兩者好似沒什么區別。為什么要學SPI呢&#xff0c;I2C和SPI有什么區別呢。為此我詳細展開說說。1.什么是 SPI&#xff1f;SPI&#xff0c;全稱 Serial Peripheral Interface&#xff0c;中…

子詞分詞器(Byte Pair Encoding + WordPiece)

參考文章&#xff1a;子詞分詞器BPE和WordPiece理解_wordpeice-CSDN博客 子詞分詞器BPE和WordPiece理解_wordpeice-CSDN博客 WordPiece 和 BPE 的區別-CSDN博客 點互信息&#xff08;PMI&#xff09;和正點互信息&#xff08;PPMI&#xff09;-CSDN博客 https://zhuanlan.z…

阿里招AI產品運營

AI產品運營&#xff08;崗位信息已經過jobleap.cn授權&#xff0c;可在csdn發布&#xff09;靈犀互娛 廣州收錄時間&#xff1a; 2025年08月05日職位描述負責AI技術在游戲行業的應用與落地&#xff0c;專注于海外市場的運營中臺建設&#xff1b; 將結合AI技術與游戲行業特點&a…

Git 分支遷移完整指南(結合分支圖分析)

基于分支圖的當前狀態分析 分支圖關鍵信息解讀?分支結構?&#xff1a; #mermaid-svg-gc9SPnwlbrM2FzHf {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-gc9SPnwlbrM2FzHf .error-icon{fill:#552222;}#mermaid-svg-…

小程序省市級聯組件使用

背景。uni-data-picker組件用起來不方便。調整后級聯效果欠佳&#xff0c;會關閉彈窗需要重新選擇。解決方案。讓cursor使用uniapp 原生組件生成懶加載省市級聯 <template><view class"picker-cascader"><view class"cascader-label">&l…

Java技術棧/面試題合集(8)-Redis篇

場景 Java入門、進階、強化、擴展、知識體系完善等知識點學習、性能優化、源碼分析專欄分享: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/140870227 通過對面試題進行系統的復習可以對Java體系的知識點進行查漏補缺。 注: 博客: 霸道流氓氣質-CSDN博…

川翔云電腦:引領開啟算力無邊界時代

一、何為云電腦&#xff1f;重新定義“主機”概念 云電腦將傳統本地計算機的核心硬件資源&#xff08;CPU、GPU、內存、硬盤等&#xff09;集中部署于遠程高性能數據中心&#xff0c;通過網絡技術將虛擬桌面實時傳輸到您的任意訪問設備上。 ??如同將高配主機裝入云端&#…

tc 介紹

目錄 1.背景 2. tc介紹 3. tc 丟包 1.背景 需要使用tc 構造丟包場景&#xff0c;注意tc 丟包不能確定丟棄的是否是payload 數據包&#xff0c;有可能丟棄 ack 包。 2. tc介紹 1. 無法正常使用 [rootpool-100-1-1-18 /]# [rootpool-100-1-1-18 /]# tc qdisc add dev swif…

LabVIEW注冊表操作

?本文圍繞LabVIEW中操作Windows 注冊表的 4 個 VI 展開&#xff0c;介紹其功能、使用場景等并對比&#xff0c;助力工程師高效運用注冊表交互功能。各 VI 功能說明&#xff08;一&#xff09;Write the Key功能&#xff1a;創建新注冊表鍵&#xff0c;設置其值&#xff0c;隨后…

阿里云部署若依后,瀏覽器能正常訪問,但是apifox和小程序訪問后報錯鏈接被重置

項目場景&#xff1a;阿里云部署若依后瀏覽器能正常通過https訪問,但是在apifox和小程序調用接口的時候生報錯E問題描述apifox報錯&#xff1a;curl報錯&#xff1a;通過curl可以清楚的看到通過域名是能準確的訪問到IP地址的&#xff0c;說明這個DNS是沒有問題的&#xff0c;但…