jBPM 4.1 與 Tomcat 深度整合、提供 Web 建模器,Spring 整合配置集中在 `jbpm.cfg.xml` 導入 `jbpm.tx.spring.cfg.xml`。
<?xml version="1.0" encoding="UTF-8"?>
<jbpm-configuration>
<import resource="jbpm.default.cfg.xml"/>
<import resource="jbpm.tx.spring.cfg.xml"/> <!-- 關鍵:Spring 事務整合 -->
<import resource="jbpm.jpdl.cfg.xml"/>
<import resource="jbpm.identity.cfg.xml"/>
<import resource="jbpm.businesscalendar.cfg.xml"/>
<import resource="jbpm.jobexecutor.cfg.xml"/> <!-- 定時器/消息,生產必開 -->
<import resource="jbpm/jbpm.mail.templates.examples.xml"/>
</jbpm-configuration>
工作日歷從 default 分離,整合邏輯封裝在 `jbpm.tx.spring.cfg.xml` 中。
<process-engine-context>
<command-service>
<spring-transaction-interceptor/> <!-- 替換標準事務攔截器 -->
...
</command-service>
...
</process-engine-context>
<transaction-context>
...
<hibernate-session current="true"/> <!-- 關鍵:使用 Spring 管理的當前 Session -->
<!-- 移除 <transaction/> 元素,完全交給 Spring 管理事務 -->
</transaction-context>
原理:`spring-transaction-interceptor` 讓 jBPM 命令執行納入 Spring 事務邊界;`hibernate-session current="true"` 從 `TransactionSynchronizationManager` 獲取 Spring 綁定的 Session,實現 Hibernate Session 與 Spring 事務同步。
<bean id="jbpmConfiguration"
class="org.jbpm.pvm.internal.cfg.SpringConfiguration">
<constructor-arg value="classpath:jbpm.cfg.xml"/>
</bean>
<bean id="processEngine"
factory-bean="jbpmConfiguration"
factory-method="buildProcessEngine"/>
<bean id="repositoryService"
factory-bean="processEngine"
factory-method="getRepositoryService"/>
<bean id="executionService"
factory-bean="processEngine"
factory-method="getExecutionService"/>
<!-- taskService, historyService, managementService 同理 -->
`SpringConfiguration` 繼承 `JbpmConfiguration` 並自動註冊為 jBPM 上下文之一,使流程表達式可訪問 Spring Bean。
<java name="echo" expr="#{echoService}" method="sayHello">
<transition name="to accept" to="join1"/>
</java>
| 項目 | 驗證方法 |
|---|---|
| 事務邊界 | Service 方法 `@Transactional`,拋異常回滾流程變更、業務數據 |
| Session 同步 | 流程變量持久化無 `Session closed` 異常 |
| Bean 注入 | 流程節點 ` |
| JobExecutor | 定時器/消息正常觸發,無事務掛起 |
| Web 建模器 | 部署 `jbpm-console.war` 可視化設計流程 |
jBPM 4.1 通過 `SpringConfiguration` 與 `spring-transaction-interceptor` 實現了**無縫 Spring 事務整合**與**雙向 Bean 訪問** (Spring 注入 jBPM 服務、流程調用 Spring Bean)。掌握 `jbpm.cfg.xml` 導入鏈、`hibernate-session current="true"`、EL 表達式 `#{beanName}` 三大核心點,即可在 Spring 生態中輕鬆駕馭流程引擎。