首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

jBPM 流程定義中配置 Action 變數注入實戰

     編輯:Java 相關知識

Action 變數注入機制

jBPM 允許在流程定義 XML (processdefinition.xml) 中為 ActionHandler 實現類聲明屬性,引擎實例化時自動注入 (Setter Injection),實現配置與代碼分離。

ActionHandler 實現類範例

package com.wfoxd.test;
import org.jbpm.graph.def.ActionHandler;
import org.jbpm.graph.exe.ExecutionContext;

public class MyActionHandler implements ActionHandler {
    private static final long serialVersionUID = 1L;

    // 測試用靜態標記
    public static boolean isExecuted = false;

    // 待注入屬性 (需提供 Setter)
    private String nameTest;
    private Integer number;

    public void setNameTest(String nameTest) { this.nameTest = nameTest; }
    public void setNumber(Integer number) { this.number = number; }

    public void execute(ExecutionContext executionContext) {
        isExecuted = true; // 標記已執行,便於單元測試驗證
        System.out.println("Injected nameTest: " + nameTest);
        System.out.println("Injected number: " + number);
        // 業務邏輯:可訪問 executionContext 獲取 token、變數、任務等
    }
}

流程定義 XML 配置片段

<process-definition name="testActionInjection">
  <start-state>
    <transition to="decisionNode"></transition>
  </start-state>

  <decision name="decisionNode">
    <!-- 節點進入動作:注入變數 -->
    <action class="com.wfoxd.test.MyActionHandler">
      <nameTest>WorkflowTest</nameTest>
      <number>123</number>
    </action>
    <transition name="pathA" to="stateA"></transition>
    <transition name="pathB" to="stateB"></transition>
  </decision>

  <state name="stateA"></state>
  <state name="stateB"></state>
</process-definition>

關鍵技術細節

  • 屬性名稱映射:XML 子元素名稱 (<nameTest>) 必須與 Java Bean 屬性名 (nameTest) 完全一致 (大小寫敏感)。
  • 型別轉換:jBPM 內建轉換器支援基本型別、包裝類、String、Date 等,複雜型別需自定義 TypeConverter。
  • 生命週期:每個流程實例進入節點時,引擎新建 ActionHandler 實例並注入屬性,執行 execute(),執行結束實例可被 GC (無狀態設計)。
  • 靜態變數警示:範例中 isExecuted 為靜態僅供單元測試驗證,生產代碼嚴禁使用靜態狀態 (多執行緒併發會導致數據錯亂)。
  • ExecutionContext 能力:在 execute() 中可獲取 token、流程變數 (getVariable/setVariable)、任務實例、上下文實例等,實現完整業務邏輯。

單元測試驗證要點

// 測試前重置
MyActionHandler.isExecuted = false;

// 載入流程定義、啟動流程實例、觸發節點
ProcessDefinition pd = ProcessDefinition.parseXmlResource("processdefinition.xml");
ProcessInstance pi = new ProcessInstance(pd);
pi.signal(); // 進入 decisionNode,觸發 Action

// 驗證
assertTrue(MyActionHandler.isExecuted);
// 進一步驗證注入值需在 execute 中設置到上下文或日誌檢查

進階應用場景

  • 將資料庫連線池、服務代理、配置參數等作為屬性注入 ActionHandler,實現依賴倒置。
  • 不同環境 (開發/測試/生產) 透過流程定義 XML 差異化配置參數,代碼零修改。
  • 結合 DecisionHandler 實現動態路由規則外部化配置。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved