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

jBPM 工作流核心節點:Decision 節點決策邏輯實現全解析

     編輯:Java 相關知識

Decision 節點核心作用

流程圖中的菱形判斷節點,根據運行時上下文動態決定流程走向 (選擇哪條 Transition),是工作流靈活性的關鍵。

三種決策實現模式

模式一:客戶端顯式指定 (最簡單、效能最佳)

若客戶端 (前端/控制器) 已知業務邏輯結果,直接發送 signal 指定目標 Transition 名稱:

// 客戶端代碼
token.signal("approve"); // 或 "reject",直接驅動流程轉向

引擎無需執行決策邏輯,直接按指定 Transition 流轉。

模式二:BeanShell 腳本決策 (內嵌邏輯)

在流程定義文件中內嵌 BeanShell 腳本,腳本必須將選擇的 Transition 名稱賦值給 transitionName 變數。

可用變數:

  • token:當前執行令牌,可獲取流程變數 token.getVariable("varName")。
  • 環境變數:流程上下文中定義的變數 (如 spottedOnTheRight, beauty)。

變數聲明優先級:環境變數定義 > 腳本內聲明 (前者效能更好)。

官方範例腳本

transitionName = "left"; // 預設路徑
if ( (spottedOnTheRight.equals("woman")) &&
     (beauty.equals("in the eye of the beholder")) ) {
    transitionName = "right"; // 滿足條件走右邊
}

模式三:ActionHandler 類實現 (複雜邏輯、Java 代碼、可測試、生產推薦)

實現 org.jbpm.graph.def.ActionHandler 介面,在 execute(ExecutionContext) 中編寫 Java 決策邏輯,最終呼叫 executionContext.getToken().signal("transitionName") 或設置 transitionName 變數。

public class MyDecisionHandler implements ActionHandler {
    public void execute(ExecutionContext ctx) {
        String userRole = (String) ctx.getVariable("userRole");
        String transition = "manager".equals(userRole) ? "approve" : "reject";
        ctx.getToken().signal(transition); // 直接驅動流轉
    }
}

流程定義中引用:<action class="com.myapp.MyDecisionHandler"/>。

最佳實踐建議

  1. 簡單業務規則:優先考慮客戶端顯式指定 (模式一),減少引擎解析開銷。
  2. 中等複雜度、頻繁變更:BeanShell 腳本 (模式二) 支援熱部署、非 Java 開發者維護。
  3. 複雜邏輯、需單元測試、型別安全、效能敏感:ActionHandler (模式三) 為首選。
  4. 避免在決策邏輯中進行耗時操作 (遠端呼叫、大量計算),保持流程引擎高吞吐。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved