在 JBPM(jBPM 3.x/4.x)工作流引擎中,變量管理是實現業務數據流轉的核心。理解流程變量(Process Variable)與任務變量(Task Variable)的作用域、存取屬性、映射規則,是設計正確流程邏輯的前提。本文通過 XML 配置實例,系統剖析兩者差異與交互機制。
流程變量定義於流程定義檔(processdefinition.xml)的 <variable> 元素,access 屬性控制父子流程間的數據流向:
| access 值 | 行為語義 | 典型場景 |
|---|---|---|
read | 子流程啟動時,從父流程讀取同名變量值,寫入子流程上下文;子流程結束時不回寫 | 父流程傳遞只讀配置參數給子流程 |
write | 子流程啟動時不讀取父流程值;子流程結束時,將子流程同名變量值回寫父流程 | 子流程執行計算/審批,結果回傳父流程 |
read,write | 雙向流動:啟動時讀取父值,結束時回寫子值(可能覆蓋父值) | 父子流程共享協作數據 |
read,write + mapped-name | 名稱映射:父流程用 name,子流程用 mapped-name,雙向同步 | 父子流程變量命名不一致時的適配 |
<variable access="read" name="master" />
<variable access="write" name="slave" />
<variable access="read,write" name="variable" />
<variable access="read,write" name="mapping" mapped-name="mapped d" />
master:父→子單向傳遞slave:子→父單向回寫variable:雙向同步,同名mapping:雙向同步,父叫 mapping,子叫 mapped d任務變量定義於任務節點的 <controller> 內,綁定表單欄位與流程變量:
<task name="chengyi">
<controller>
<variable name="v1" access="read" mapped-name="test v1" />
<variable name="v2" access="write" mapped-name="test v2" />
<variable name="v3" access="read,write" mapped-name="test v3" />
<variable name="v4" access="read,write,required" mapped-name="test v4" />
</controller>
</task>
| 變量 | access | 初始化(任務建立時) | 完成(任務結束時) | 關鍵差異 |
|---|---|---|---|---|
| v1 | read | 從流程上下文讀取 key=v1 的值 → Controller 變量 v1 | 不回寫 流程上下文 | 純展示用,如顯示審批歷史 |
| v2 | write | 不讀取 流程上下文,Controller v2 初始為 null | 將 Controller v2 值回寫流程上下文,key 為 v2(無 mapped-name 時) | 純輸入用,如錄入審批意見 |
| v3 | read,write | 讀取流程 key=v3 → Controller v3 | 回寫流程,key 為 mapped-name 值(test v3),而非 v3 | 雙向綁定,且支援名稱映射 |
| v4 | read,write,required | 同 v3 | 同 v3,但強制回寫:若未設值拋出 IllegalArgumentException | 必填字段保護 |
name 對應流程變量 key,mapped-name 對應 Controller/表單欄位名| 維度 | 流程變量 | 任務變量 |
|---|---|---|
| 作用域 | 整個流程實例(跨節點) | 單一任務實例(節點內) |
| 生命週期 | 流程啟動→流程結束 | 任務建立→任務完成 |
| 定義位置 | <process-definition> 根節點 | <task> 節點下的 <controller> |
| 數據流向控制 | access 控制父子流程間流向 | access 控制任務與流程上下文間流向 |
| 名稱映射 | mapped-name 用於父子流程映射 | mapped-name 用於表單欄位與流程變量映射 |
| 持久化 | 存儲於 jbpm_variableinstance,processinstance_ 關聯流程 | 同表,但 taskinstance_ 關聯任務實例 |
read,只需寫入的用 write,避免誤覆蓋流程數據orderId),表單欄位用下劃線(order_id),透過 mapped-name 映射,語義清晰required 僅在任務完成時檢查,建議在表單前端/Controller 邏輯中提前校驗,體驗更好read,write 導致的併發覆蓋,必要時用鎖或分離變量總結:流程變量是「全局總線」,任務變量是「節點適配器」。掌握 access 四種模式與 mapped-name 映射機制,能精準控制數據在流程層與任務層的流向,構建清晰、可維護的工作流應用。