活動支援基於轉移或活動組合的循環結構,循環中可包含等待狀態。為支援多次自動循環執行,PVM 將遞歸傳播機制轉換為 while 迴圈,避免堆疊溢出風險。
內容待補充 (TODO):將詳細說明子流程的調用語境、參數傳遞、異常傳播與獨立事務邊界管理。
當 ActivityBehaviour 未主動調用流程傳播方法時,引擎採用默認行為:
流程語言可通過重寫 ExecutionImpl.proceed() 方法自定義默認行為。
功能活動同時實現 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) { /* 執行業務邏輯 */ }
}
本節通過圖解演示執行在客戶端線程中如何從一個等待狀態推進至下一個等待狀態。核心原則: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();
執行流程演示:
startProcessInstance() → 執行定位於初始等待狀態 "wait 1"signal() → 穿越 automatic 1~4,停於 "wait 2"signal() → 直接到達 "wait 3"



核心洞察:等待狀態之間的計算工作極短(通常 <1 秒),而等待可能持續數小時至數年。因此默認採用客戶端線程同步執行,將「外部觸發後到下一等待狀態前」的所有計算包含在單一事務中。
開發者核心任務:識別流程中的「外部觸發點」(等待狀態),區分系統自動執行與人工/外部系統介入的環節。
併發建模採用父子樹結構:主執行路徑即流程實例(根節點)。分支活動通過 createExecution() 創建子執行,合併活動通過 stop() 結束同步路徑。

圖 7.6 執行結構 UML 類圖

圖 7.7 併發執行路徑:付款與發貨並行
異常處理器可綁定至任意流程元素,類似為委派類方法包裝 try-catch。處理流程:
關鍵難點:等待狀態活動發生異常時,需確保 waitForSignal() 的調用不被跳過,否則執行會錯誤繼續。控制流活動需包裝 try-finally 確保狀態一致性。
待補充主題:exceptionHandler.isRethrowMasked、事務性異常處理器、Error 異常不捕獲策略。
流程修改:內容待補充 (TODO)
執行狀態與鎖定:執行僅有兩種狀態——STATE_ACTIVE(執行中/等待觸發)與鎖定狀態(唯讀)。鎖定狀態下禁止修改操作,但允許事件觸發、變量更新、子節點增刪。

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