jBPM 4 內建 IOC 容器,與 Spring 整合核心在於:**統一 SessionFactory 管理**、**共享交易管理器**、**在 jBPM 環境中訪問 Spring Bean**。本文詳細示範兩種整合模式的配置步驟與程式碼實作。
JbpmConfiguration:jBPM 核心配置入口ProcessEngine:外觀模式,提供 RepositoryService、ExecutionService 等服務Environment:運行時環境,包含 Engine IOC (process-engine-context) 與 Transaction IOC (transaction-context)編輯 jbpm.spring.default.cfg.xml,註解掉:
<!--
<hibernate-configuration>
<cfg resource="jbpm.hibernate.cfg.xml"/>
</hibernate-configuration>
<hibernate-session-factory/>
-->
<bean id="processEngine" class="com.family168.jbpm.ProcessEngineFactoryBean">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
public class ProcessEngineFactoryBean {
private SessionFactory sessionFactory;
private String jbpmConfigurationLocation;
private ApplicationContext applicationContext;
private ProcessEngine processEngine;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public void afterPropertiesSet() {
SpringConfiguration cfg = new SpringConfiguration(jbpmConfigurationLocation);
cfg.setApplicationContext(applicationContext);
cfg.setSessionFactory(sessionFactory); // 關鍵:注入共享 SessionFactory
this.processEngine = cfg.buildProcessEngine();
}
public ProcessEngine getObject() { return processEngine; }
public Class<?> getObjectType() { return ProcessEngine.class; }
public boolean isSingleton() { return true; }
}
ProcessEngine processEngine = (ProcessEngine) ctx.getBean("processEngine");
RepositoryService repositoryService = processEngine.getRepositoryService();
// ... 其他服務
<!-- 原標準交易攔截器 -->
<standard-transaction-interceptor/>
<!-- 改為 Spring 交易攔截器,current="true" 表示從當前執行緒獲取 -->
<spring-transaction-interceptor current="true"/>
<!-- 原交易與 Hibernate Session 配置 -->
<transaction/>
<hibernate-session/>
<!-- 改為從當前執行緒獲取 -->
<hibernate-session current="true"/>
<!-- 1. jBPM SpringConfiguration -->
<bean id="jbpmConfiguration" class="org.jbpm.pvm.internal.cfg.SpringConfiguration">
<constructor-arg value="jbpm/jbpm.cfg.xml"/>
</bean>
<!-- 2. ProcessEngine 透過 FactoryBean 取得 -->
<bean id="processEngine" factory-bean="jbpmConfiguration" factory-method="buildProcessEngine"/>
<!-- 3. jbpmTemplate 管理交易邊界 -->
<bean id="jbpmTemplate" class="com.family168.jbpm.JbpmTemplate">
<property name="processEngine" ref="processEngine"/>
<property name="dataSource" ref="dataSource"/>
</bean>
public class JbpmTemplate {
private ProcessEngine processEngine;
private DataSource dataSource;
private PlatformTransactionManager transactionManager;
public void setProcessEngine(ProcessEngine processEngine) { this.processEngine = processEngine; }
public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; }
public void setTransactionManager(PlatformTransactionManager tm) { this.transactionManager = tm; }
public <T> T execute(JbpmCallback<T> callback) {
TransactionTemplate txTemplate = new TransactionTemplate(transactionManager);
return txTemplate.execute(status -> {
// 綁定 Session/交易至當前執行緒
TransactionSynchronizationManager.bindResource(dataSource, new ConnectionHolder(dataSource.getConnection()));
try {
return callback.doInJbpm(processEngine);
} finally {
TransactionSynchronizationManager.unbindResource(dataSource);
}
});
}
}
JbpmTemplate template = (JbpmTemplate) ctx.getBean("jbpmTemplate");
template.execute(processEngine -> {
RepositoryService repo = processEngine.getRepositoryService();
// 部署流程定義等操作
return null;
});
| 維度 | 方式一:手工注入 SessionFactory | 方式二:ThreadLocal 獲取 (推薦) |
|---|---|---|
| SessionFactory 來源 | Spring 直接注入 | Spring 綁定至 ThreadLocal,jBPM 從中獲取 |
| 交易管理 | jBPM 內建 (需額外配置同步) | 完全委派 Spring @Transactional / TransactionTemplate |
| 複雜度 | 較低 | 較高 (需 JbpmTemplate) |
| Spring 整合度 | 部分 | 完全 (交易、Session 完全由 Spring 控制) |
| 適用場景 | 簡單整合、非 Spring 交易管理 | 企業級應用、需聲明式交易、多資料源 |
SpringConfiguration:繼承 JbpmConfiguration,實作 ApplicationContextAware,將 Spring ApplicationContext 注入 jBPM Environment (透過 SpringContext 封裝)SpringTransactionInterceptor:從 Environment 的 SpringContext 獲取 PlatformTransactionManager,使用交易模板回調 Commandhibernate-session current="true":強制從 TransactionSynchronizationManager 獲取當前綁定的 Hibernate Session