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

jBPM 4.0 開發指南:第 7 章 進階圖形執行與併發控制

     編輯:Java 相關知識

第 7 章 進階圖形執行與併發控制

7.1 循環執行機制

活動支援基於轉移或活動組合的循環結構,循環中可包含等待狀態。為支援多次自動循環執行,PVM 將遞歸傳播機制轉換為 while 迴圈,避免堆疊溢出風險。

7.2 子流程

內容待補充 (TODO):將詳細說明子流程的調用語境、參數傳遞、異常傳播與獨立事務邊界管理。

7.3 默認執行行為

當 ActivityBehaviour 未主動調用流程傳播方法時,引擎採用默認行為:

  1. 若當前活動有默認輸出轉移,選擇該轉移
  2. 若有父活動,回退至父活動繼續執行
  3. 否則結束當前執行

流程語言可通過重寫 ExecutionImpl.proceed() 方法自定義默認行為。

7.4 功能活動:無副作用的自動化任務

功能活動同時實現 Activity 與 EventListener 介面,用於發送郵件、資料庫更新、PDF 生成等純計算任務。關鍵特徵:不調用任何執行傳播方法,執行完成後自動遵循默認行為。

public class FunctionalActivity implements Activity, EventListener {
    public void execute(ActivityExecution execution) { perform(execution); }
    public void notify(EventListenerExecution execution) { perform(execution); }
    void perform(OpenExecution execution) { /* 執行業務邏輯 */ }
}

7.5 執行與線程模型:從等待狀態到等待狀態

本節通過圖解演示執行在客戶端線程中如何從一個等待狀態推進至下一個等待狀態。核心原則:signal 方法阻塞直到到達下一個等待狀態。

多自動活動流程圖

圖 7.1 多自動活動流程結構

流程構建範例(使用 ProcessFactory 流暢 API):

ClientProcessDefinition processDefinition = ProcessFactory.build("automatic")
    .activity("wait 1").initial().behaviour(new WaitState())
    .transition().to("automatic 1")
    .activity("automatic 1").behaviour(new Display("one"))
    .transition().to("wait 2")
    .activity("wait 2").behaviour(new WaitState())
    .transition().to("automatic 2")
    .activity("automatic 2").behaviour(new Display("two"))
    .transition().to("automatic 3")
    .activity("automatic 3").behaviour(new Display("three"))
    .transition().to("automatic 4")
    .activity("automatic 4").behaviour(new Display("four"))
    .transition().to("wait 3")
    .activity("wait 3").behaviour(new WaitState())
    .done();

執行流程演示:

  1. startProcessInstance() → 執行定位於初始等待狀態 "wait 1"
  2. 第一次 signal() → 穿越 automatic 1~4,停於 "wait 2"
  3. 第二次 signal() → 直接到達 "wait 3"

執行定位於 wait 1

第一次 signal 到達 wait 2

第二次 signal 到達 wait 3

7.6 持久化模式下的事務邊界設計

持久化模式事務超時

核心洞察:等待狀態之間的計算工作極短(通常 <1 秒),而等待可能持續數小時至數年。因此默認採用客戶端線程同步執行,將「外部觸發後到下一等待狀態前」的所有計算包含在單一事務中。

開發者核心任務:識別流程中的「外部觸發點」(等待狀態),區分系統自動執行與人工/外部系統介入的環節。

7.7 流程併發:執行樹結構與分支合併

併發建模採用父子樹結構:主執行路徑即流程實例(根節點)。分支活動通過 createExecution() 創建子執行,合併活動通過 stop() 結束同步路徑。

執行結構 UML 類圖

圖 7.6 執行結構 UML 類圖

併發執行路徑示例

圖 7.7 併發執行路徑:付款與發貨並行

7.8 異常處理器機制

異常處理器可綁定至任意流程元素,類似為委派類方法包裝 try-catch。處理流程:

  1. 委派類拋出異常
  2. 向上查找匹配的異常處理器
  3. 處理器處理後,異常視為已處理,執行繼續

關鍵難點:等待狀態活動發生異常時,需確保 waitForSignal() 的調用不被跳過,否則執行會錯誤繼續。控制流活動需包裝 try-finally 確保狀態一致性。

待補充主題:exceptionHandler.isRethrowMasked、事務性異常處理器、Error 異常不捕獲策略。

7.9 流程修改與鎖定機制

流程修改:內容待補充 (TODO)

執行狀態與鎖定:執行僅有兩種狀態——STATE_ACTIVE(執行中/等待觸發)與鎖定狀態(唯讀)。鎖定狀態下禁止修改操作,但允許事件觸發、變量更新、子節點增刪。

執行狀態圖

圖 7.8 執行狀態機

鎖定場景:執行結束、暫停、異步延續過程中。外部實例(人工任務、服務調用、文件輪詢)通過鎖定獲取執行的完全控制權,防止內部與外部並發衝突。外部實例負責管理鎖定生命週期,確保超時與正常響應的互斥處理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved