程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> jBPM4與Spring的集成

jBPM4與Spring的集成

編輯:關於JAVA

現在流行抱大腿,不過對眼光的要求也高。要不就如高也,即使四眼,一樣無用。對Java企業開發而 言,Spring的腿則是一定要抱的。而所謂抱Spring的腿,無外乎三點:

一是通過Spring暴露出服務,將服務配置到Spring的IOC容器裡;

二是在自己的運行環境裡訪問到Spring的IOC容器,能夠輕松使用Spring容器裡所配置的服務;

三是對於具有事務管理特性的項目來說,將事務管理與Spring的事務管理進行合並。

下面分別討論:

一、通過Spring暴露服務

還記得在jBPM4的運行期環境裡提到的JbpmConfiguration嗎?它是整個jBPM4的入口,並且是整個應用 獨此一份的。通過它可以獲取processEngine,並藉此獲得工作流引擎所提供的各種服務:

ProcessEngine processEngine = new Configuration()
      .buildProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
ExecutionService executionService = processEngine.getExecutionService();
TaskService taskService = processEngine.getTaskService();
HistoryService historyService = processEngine.getHistoryService();
ManagementService managementService = processEngine.getManagementService();

通過Spring暴露這些服務,配置如下:

<bean id="jbpmConfiguration" 

class="org.jbpm.pvm.internal.cfg.SpringConfiguration">
        <constructor-arg value="be/inze/spring/demo/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" />

細心的你會發現,配置時使用了JbpmConfiguration 的子類SpringConfiguration。 SpringConfiguration相比JbpmConfiguration有哪些增強呢,下面再講。總之,現在,就可以使用Spring 來獲取或注入這些Jbpm4所提供的服務了。

二、在environment裡加入SpringContext

jBPM4的environment(運行期環境)提供Engine IOC(process-engine-context)和Transaction IOC (transaction-context)。要想在運行期方便地訪問到Spring裡所配置的服務,最直接的方法就是在 environment裡加入Spring IOC(applicationContext)的引用。

SpringConfiguration即是對JbpmConfiguration增強了對Spring IOC的一個引用。

SpringConfiguration是如何做到的呢?簡單,實現Spring的ApplicationContextAware接口,自動持 有applicationContext,然後openEnvironment時將其加入environment。

environment.setContext(new SpringContext(applicationContext));

SpringContext是對applicationContext的簡單封裝。

那麼什麼從Engine IOC移民到Spring IOC了呢?是的,最重要的就是Hibernate Session Factory。

在jbpm.cfg.xml的process-engine-context裡干掉:

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

    <hibernate-session-factory />

相關配置挪動至Spring配置文件。

三、事務

哪裡有數據庫操作,哪裡就有事務。對於嵌入式工作流而言,最重要的集成就是事務的集成。這裡先 分析jBPM4的事務實現,然後再介紹集成入Spring的事務實現。

1、Command模式

jBPM4的邏輯實現采用了Command模式。

采用Command模式後,jBPM4對CommandService構造攔截器(Interceptor)鏈,配置在jbpm.cfg.xml的 process-engine-context裡:

<command-service>
      <retry-interceptor />
      <environment-interceptor />
      <standard-transaction-interceptor />
    </command-service>

2、原有的事務實現

jBPM4原有的事務通過StandardTransactionInterceptor實現,在CommandService執行Command之前打 開事務(實際委派Hibernate的事務管理),完成後提交/回滾。

jBPM4的事務是基於Command的。

3、集成入Spring的事務實現

Spring的事務是基於服務調用的。

使jBPM4使用Spring提供的事務:

<command-service>
      <retry-interceptor />
      <environment-interceptor />
      <spring-transaction-interceptor current="true" />
</command-service>

攔截器換用SpringTransactionInterceptor,SpringTransactionInterceptor從environment 提供的 Spring IOC獲取PlatformTransactionManager,使用事務模板回調Command,事務傳播模式強制加入當前 事務。

同時,對hibernate session的配置(jbpm.cfg.xml的transaction-context)強制從當前線程中獲取 :

<hibernate-session current="true"/>

並干掉原有的事務實現:

<transaction />

參考文檔:

http://www.slideshare.net/guest8d4bce/spring-integration-with-jbpm4

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved