PVM 不內建具體流程結構,而是將活動的運行時行為委派給 ActivityBehaviour 介面:
public interface ActivityBehaviour extends Serializable {
void execute(ActivityExecution execution) throws Exception;
}
活動行為擁有執行傳播的完全控制權,可調用:
execution.take(Transition):選擇特定轉移execution.waitForSignal():進入等待狀態public class Display implements ActivityBehaviour {
private String message;
public Display(String message) { this.message = message; }
public void execute(ActivityExecution execution) {
System.out.println(message);
}
}

圖 5.1 Display 實例流程
啟動流程:Execution execution = processDefinition.startExecution(); 控制台輸出:
hello
world
關鍵點:活動通過構造函數注入配置參數(如 message),實現邏輯復用。未調用傳播方法時,默認行為依序選擇轉移,無轉移則結束執行。
外部活動代表流程執行需等待外部觸發的環節(人工任務、服務回調等)。擴展介面:
public interface ExternalActivity extends Activity {
void signal(Execution execution, String signal, Map<String, Object> parameters) throws Exception;
}
生命週期:
execute() 調用 → 執行準備工作 → waitForSignal() 進入等待signal() → 處理參數 → take(signalName) 選擇轉移繼續public class WaitState implements ExternalActivity {
public void execute(ActivityExecution execution) {
execution.waitForSignal();
}
public void signal(ActivityExecution execution, String signalName, Map<String, Object> parameters) {
execution.take(signalName); // signalName 對應轉移名稱
}
}

圖 5.3 貸款審批流程
使用 ProcessFactory 流暢 API 構建:
ClientProcessDefinition processDefinition = ProcessFactory.build("loan")
.activity("submit loan request").initial().behaviour(new Display("loan request submitted"))
.transition().to("evaluate")
.activity("evaluate").behaviour(new WaitState())
.transition("approve").to("wire money")
.transition("reject").to("end")
.activity("wire money").behaviour(new Display("wire the money"))
.transition().to("archive")
.activity("archive").behaviour(new WaitState())
.transition().to("end")
.activity("end").behaviour(new WaitState())
.done();
執行流程演示:
startProcessInstance() → 執行自動活動,停於 "evaluate"signal("approve") → 選擇 approve 轉移 → 執行 "wire money" → 停於 "archive"signal("approve") → 到達 "end" 結束


事件允許在不修改流程圖的前提下注入技術邏輯(如資料庫操作),促進業務分析師與開發者協作。核心介面:
public interface EventListener extends Serializable {
void notify(EventListenerExecution execution) throws Exception;
}
常見自動觸發事件:活動進入/離開、轉移選擇、流程啟動/結束等(詳細見用戶手冊)。
事件沿組合繼承結構向上傳播:活動 → 父組合 → 流程定義。可通過 propagationDisabled() 禁用特定監聽器的傳播。
public class DisplaySource implements EventListener {
public void execute(EventListenerExecution execution) {
System.out.println("leaving " + execution.getEventSource());
}
}
範例演示:組合活動註冊 DisplaySource 監聽 end 事件,子活動離開時觸發傳播,控制台輸出事件源資訊。禁用傳播後,僅直接註冊於組合的監聽器生效。