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

jBPM 4.0 開發指南:第 5 章 基礎活動實現與流程構建實戰

     編輯:Java 相關知識

第 5 章 基礎活動實現與流程構建實戰

5.1 ActivityBehaviour:活動行為核心介面

PVM 不內建具體流程結構,而是將活動的運行時行為委派給 ActivityBehaviour 介面:

public interface ActivityBehaviour extends Serializable {
    void execute(ActivityExecution execution) throws Exception;
}

活動行為擁有執行傳播的完全控制權,可調用:

  • execution.take(Transition):選擇特定轉移
  • execution.waitForSignal():進入等待狀態
  • 若無調用,遵循默認執行行為(見 7.3 節)

5.2 入門範例:Display 自動活動

public class Display implements ActivityBehaviour {
    private String message;
    public Display(String message) { this.message = message; }
    public void execute(ActivityExecution execution) {
        System.out.println(message);
    }
}

Display 實例流程

圖 5.1 Display 實例流程

啟動流程:Execution execution = processDefinition.startExecution(); 控制台輸出:

hello
world

關鍵點:活動通過構造函數注入配置參數(如 message),實現邏輯復用。未調用傳播方法時,默認行為依序選擇轉移,無轉移則結束執行。

5.3 ExternalActivityBehaviour:等待狀態活動

外部活動代表流程執行需等待外部觸發的環節(人工任務、服務回調等)。擴展介面:

public interface ExternalActivity extends Activity {
    void signal(Execution execution, String signal, Map<String, Object> parameters) throws Exception;
}

生命週期:

  1. execute() 調用 → 執行準備工作 → waitForSignal() 進入等待
  2. 外部觸發調用 signal() → 處理參數 → take(signalName) 選擇轉移繼續

5.4 WaitState 實現範例

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.5 綜合範例:貸款審批流程

貸款流程圖

圖 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();

執行流程演示:

  1. startProcessInstance() → 執行自動活動,停於 "evaluate"
  2. signal("approve") → 選擇 approve 轉移 → 執行 "wire money" → 停於 "archive"
  3. signal("approve") → 到達 "end" 結束

位於 evaluate

位於 archive

位於 end

5.6 事件機制:業務與技術邏輯分離

事件允許在不修改流程圖的前提下注入技術邏輯(如資料庫操作),促進業務分析師與開發者協作。核心介面:

public interface EventListener extends Serializable {
    void notify(EventListenerExecution execution) throws Exception;
}

常見自動觸發事件:活動進入/離開、轉移選擇、流程啟動/結束等(詳細見用戶手冊)。

5.7 事件傳播與禁用控制

事件沿組合繼承結構向上傳播:活動 → 父組合 → 流程定義。可通過 propagationDisabled() 禁用特定監聽器的傳播。

public class DisplaySource implements EventListener {
    public void execute(EventListenerExecution execution) {
        System.out.println("leaving " + execution.getEventSource());
    }
}

範例演示:組合活動註冊 DisplaySource 監聽 end 事件,子活動離開時觸發傳播,控制台輸出事件源資訊。禁用傳播後,僅直接註冊於組合的監聽器生效。

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