jBPM 4.0 的環境組件本質上是一個控制反轉(IoC)容器。它負責讀取配置資訊,根據定義實例化對象、配置屬性,並將各組件連接成完整的對象圖。環境機制的核心目標是讓流程虛擬機(PVM)的各個部分具備高度可配置性,使其能夠靈活運行於標準 Java SE 環境或企業級 Java EE 環境之中。
環境採用分層架構,每一層環境擁有獨立的生命週期:
每個環境層級都暴露一組鍵值對,供上層邏輯查找所需的資源與服務。
要開始使用環境機制,首先需要獲取 EnvironmentFactory 實例。通常將其作為靜態成員變量保存,贯穿應用的整個生命週期:
static EnvironmentFactory environmentFactory =
EnvironmentFactory.parse(new ResourceStreamSource("pvm.cfg.xml"));
更多流來源類型請參考 org.jbpm.stream 包的 Javadoc 文檔。
默認解析器會創建 DefaultEnvironmentFactory。框架預留了 Spring 作為 IoC 容器的整合介面(目前仍處於 TODO 狀態),開發者可通過 EnvironmentFactory.setParser(Parser) 靜態方法自定義解析器。
環境塊定義了 block 環境的作用域,典型用法如下:
Environment environment = environmentFactory.openEnvironment();
try {
// 業務邏輯執行區
} finally {
environment.close(); // 確保資源釋放
}
在環境塊內,可通過名稱或類型查找對象:
environment.get(String name)<T> T environment.get(Class<T> type)環境創建時會自動包含 process-engine 環境與 block 環境。默認實現中兩者均為 WireContext 實例,內部維護對象創建邏輯與綁定關係。
以下範例展示如何配置並獲取 Book 對象:
// 配置環境工廠
static EnvironmentFactory environmentFactory = EnvironmentFactory.parseXmlString(
"<jbpm-configuration>" +
" <process-engine>" +
" <object name='book' class='org.jbpm.examples.ch09.Book' />" +
" </process-engine>" +
"</jbpm-configuration>"
);
// 使用環境塊查找對象
Environment environment = environmentFactory.openEnvironment();
try {
Book book = environment.get(Book.class); // 按類型查找
assertNotNull(book);
assertSame(book, environment.get("book")); // 按名稱查找
} finally {
environment.close();
}
為避免在方法簽名中傳遞環境對象,框架提供了 ThreadLocal 堆疊機制:
Environment environment = Environment.getCurrent();
環境支援動態添加與移除,任意對象皆可作為 Context 暴露:
public interface Context {
Object get(String key);
<T> T get(Class<T> type);
Set<String> keys();
// ...
}
查找時採用「後添加優先」的搜索順序:若同一對象同時存在於流程引擎環境與塊環境,塊環境的定義將優先被返回。開發者亦可通過可選參數自定義搜索順序。