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

jBPM 4 與 Spring 整合的兩種方式完整指南

     編輯:Java 相關知識

jBPM 4 內建 IOC 容器,與 Spring 整合核心在於:**統一 SessionFactory 管理**、**共享交易管理器**、**在 jBPM 環境中訪問 Spring Bean**。本文詳細示範兩種整合模式的配置步驟與程式碼實作。

前置知識:jBPM 4 環境架構

  • JbpmConfiguration:jBPM 核心配置入口
  • ProcessEngine:外觀模式,提供 RepositoryService、ExecutionService 等服務
  • Environment:運行時環境,包含 Engine IOC (process-engine-context) 與 Transaction IOC (transaction-context)

方式一:手工將 Spring SessionFactory 注入 jBPM

步驟 1:停用 jBPM 內建 Hibernate 配置

編輯 jbpm.spring.default.cfg.xml,註解掉:

<!--
<hibernate-configuration>
  <cfg resource="jbpm.hibernate.cfg.xml"/>
</hibernate-configuration>
<hibernate-session-factory/>
-->

步驟 2:Spring 配置 ProcessEngine FactoryBean

<bean id="processEngine" class="com.family168.jbpm.ProcessEngineFactoryBean">
  <property name="sessionFactory" ref="sessionFactory"/>
</bean>

步驟 3:FactoryBean 實作注入 SessionFactory

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; }
}

步驟 4:使用服務

ProcessEngine processEngine = (ProcessEngine) ctx.getBean("processEngine");
RepositoryService repositoryService = processEngine.getRepositoryService();
// ... 其他服務

方式二:從當前執行緒獲取 SessionFactory 與交易 (推薦)

步驟 1:同方式一,停用 jBPM 內建 Hibernate 配置

步驟 2:修改 jbpm.tx.spring.cfg.xml

<!-- 原標準交易攔截器 -->
<standard-transaction-interceptor/>
<!-- 改為 Spring 交易攔截器,current="true" 表示從當前執行緒獲取 -->
<spring-transaction-interceptor current="true"/>

<!-- 原交易與 Hibernate Session 配置 -->
<transaction/>
<hibernate-session/>
<!-- 改為從當前執行緒獲取 -->
<hibernate-session current="true"/>

步驟 3:Spring 配置

<!-- 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>

步驟 4:JbpmTemplate 實作 (交易模板)

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);
            }
        });
    }
}

步驟 5:使用方式

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,使用交易模板回調 Command
  • hibernate-session current="true":強制從 TransactionSynchronizationManager 獲取當前綁定的 Hibernate Session

參考資源

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