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

jBPM 4.0 開發指南第 13 章:三種執行模式——物件、持久化與嵌入式完整比較

     編輯:Java 相關知識

三種執行模式概覽

模式特點適用場景
物件模式直接操作 API 物件圖,無資料庫,無事務邊界單元測試、原型驗證、嵌入式無持久化需求
持久化模式流程定義/執行儲存資料庫,透過 Service API 操作,需事務生產環境、叢集、長期運行流程、審計追蹤
嵌入式模式執行狀態序列化存入領域物件(如 Loan.execution),由 Hibernate 透明持久化領域模型驅動設計、狀態與業務資料強綁定

13.1 物件模式範例

ClientProcessDefinition pd = ProcessFactory.build("loan")
    .activity("submit").initial().behaviour(AutomaticActivity.class)
    .transition().to("evaluate")
    .activity("evaluate").behaviour(WaitState.class)
    .transition("approve").to("wire")
    .transition("reject").to("end")
    .activity("wire").behaviour(AutomaticActivity.class)
    .transition().to("archive")
    .activity("archive").behaviour(WaitState.class)
    .transition().to("end")
    .activity("end").behaviour(WaitState.class)
    .done();

ClientExecution exec = pd.startProcessInstance(); // 阻塞至 evaluate
assertEquals("evaluate", exec.getActivityName());
exec.signal("approve"); // 執行 wire → archive
assertEquals("archive", exec.getActivityName());
exec.signal(); // 取預設轉移 → end
assertEquals("end", exec.getActivityName());

13.2 持久化模式

  • 需 environment.cfg.xml + hibernate.properties(見第 14 章)。
  • 從 EnvironmentFactory 取得 ProcessService、ExecutionService、ManagementService。
  • ProcessService.deploy() 部署流程定義(自動版本化)。
  • ExecutionService.startExecution("loan:1", "request7836") 啟動實例,回傳介面而非實體(避免 LazyInitializationException)。
  • ExecutionService.signalExecution(id, "approve") 觸發推進。

13.3 嵌入式模式

領域物件內嵌 ClientExecution 欄位,以 Hibernate ExecutionType 自訂類型映射:

public class Loan {
    private static final ClientProcessDefinition pd = createLoanProcess();
    private ClientExecution execution;
    private String customer; private double amount;

    public Loan(String customer, double amount) {
        this.customer = customer; this.amount = amount;
        this.execution = pd.startProcessInstance();
    }
    public void approve() { execution.signal("approve"); }
    public void reject() { execution.signal("reject"); }
    public String getState() { return execution.getActivityName(); }
    // getters/setters ...
}

Hibernate 映射 Loan.hbm.xml

<typedef name="execution" class="org.jbpm.pvm.internal.hibernate.ExecutionType"/>
<class name="Loan" table="LOAN">
  <id name="dbid"><generator class="sequence"/></id>
  <property name="execution" type="execution"/>
  <property name="customer"/>
  <property name="amount"/>
</class>

使用方式

Session s = sf.openSession(); Transaction tx = s.beginTransaction();
Loan loan = new Loan("john doe", 234.0); s.save(loan); // 狀態 evaluate
tx.commit(); s.close();

// 新事務載入並推進
s = sf.openSession(); tx = s.beginTransaction();
loan = (Loan) s.get(Loan.class, loan.getDbid());
loan.approve(); // 狀態 archive
tx.commit(); s.close();

資料庫中 LOAN 表單欄 execution 儲存序列化後的執行狀態,隨業務資料同步持久化。

模式選擇指南

  • 需完整審計、叢集、長期存活 → 持久化模式。
  • 流程狀態屬於特定業務實體、領域模型豐富 → 嵌入式模式。
  • 測試、原型、無狀態短流程 → 物件模式。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved