jBPM4与Spring的集成

系统 1696 0

 现在流行抱大腿,不过对眼光的要求也颇高。要不就如高也,即使四眼,一样无用。对Java企业开发而言,Spring的腿则是一定要抱的。而所谓抱Spring的腿,无外乎三点:

 

一是通过Spring暴露出服务,将服务配置到Spring的IOC容器里;

二是在自己的运行环境里访问到Spring的IOC容器,能够轻松使用Spring容器里所配置的服务;

三是对于具有事务管理特性的项目来说,将事务管理与Spring的事务管理进行合并。


      下面分别讨论:

一、    通过Spring暴露服务
还记得在jBPM4的运行期环境里提到的JbpmConfiguration吗?它是整个jBPM4的入口,并且是整个应用独此一份的。通过它可以获取processEngine,并藉此获得工作流引擎所提供的各种服务:

Java代码 复制代码
  1. ProcessEngine processEngine =  new  Configuration()   
  2.       .buildProcessEngine();  
      ProcessEngine processEngine = new Configuration()
      .buildProcessEngine();
    

 

 

Java代码 复制代码
  1. RepositoryService repositoryService = processEngine.getRepositoryService();   
  2. ExecutionService executionService = processEngine.getExecutionService();   
  3. TaskService taskService = processEngine.getTaskService();   
  4. HistoryService historyService = processEngine.getHistoryService();   
  5. ManagementService managementService = processEngine.getManagementService();  
      RepositoryService repositoryService = processEngine.getRepositoryService();
ExecutionService executionService = processEngine.getExecutionService();
TaskService taskService = processEngine.getTaskService();
HistoryService historyService = processEngine.getHistoryService();
ManagementService managementService = processEngine.getManagementService();
    

 



通过Spring暴露这些服务,配置如下:

Xml代码 复制代码
  1. < bean   id = "jbpmConfiguration"   class = "org.jbpm.pvm.internal.cfg.SpringConfiguration" >   
  2.          < constructor-arg   value = "be/inze/spring/demo/jbpm.cfg.xml"   />   
  3.      </ bean >   
  4.       
  5.      < bean   id = "processEngine"   factory-bean = "jbpmConfiguration"   factory-method = "buildProcessEngine"   />   
  6.      < bean   id = "repositoryService"   factory-bean = "processEngine"   factory-method = "getRepositoryService"   />   
  7.      < bean   id = "executionService"   factory-bean = "processEngine"   factory-method = "getExecutionService"   />   
      <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。

Java代码 复制代码
  1. environment.setContext( new  SpringContext(applicationContext));  
      environment.setContext(new SpringContext(applicationContext));
    

 


SpringContext是对applicationContext的简单封装。

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

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

Xml代码 复制代码
  1. < hibernate-configuration >   
  2.    < cfg   resource = "jbpm.hibernate.cfg.xml"   />        
  3. </ hibernate-configuration >   
  4.   
  5. < hibernate-session-factory   />   
          <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里:

Xml代码 复制代码
  1. < command-service >   
  2.        < retry-interceptor   />   
  3.        < environment-interceptor   />   
  4.        < standard-transaction-interceptor   />   
  5.      </ command-service >   
      <command-service>
      <retry-interceptor />
      <environment-interceptor />
      <standard-transaction-interceptor />
    </command-service>
    

 


2、    原有的事务实现

jBPM4原有的事务通过StandardTransactionInterceptor实现,在CommandService执行Command之前打开事务(实际委派Hibernate的事务管理),完成后提交/回滚。
 

 

jBPM4的事务是基于Command的。

3、    集成入Spring的事务实现
Spring的事务是基于服务调用的。
 

 

使jBPM4使用Spring提供的事务:

Xml代码 复制代码
  1. < command-service >   
  2.        < retry-interceptor   />   
  3.        < environment-interceptor   />   
  4.        < spring-transaction-interceptor   current = "true"   />   
  5. </ command-service >   
      <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)强制从当前线程中获取:

Xml代码 复制代码
  1. < hibernate-session   current = "true" />   
      <hibernate-session current="true"/>
    

 


并干掉原有的事务实现:

Xml代码 复制代码
  1. < transaction   />   
      <transaction />
    

 


参考文档:
http://www.slideshare.net/guest8d4bce/spring-integration-with-jbpm4

 jbpm4GA发布已有一个月了,作为jbpm的新手,发现关于jbpm4的资源太稀少了,本人把jbpm4与spring的整合过程发布一下。本人使用struts2+hibernate+spring整合环境。
    首先复制官方下载的压缩包中jbpm.jar到项目中,并根据脚本创建数据库表。
     其次在spring的配置文件applicationContext.xml中的sessionFactory中加入
    <property name="configLocation" value="classpath:jbpm.hibernate.cfg.xml" />
    <bean id="jbpmConfiguration" class="org.jbpm.pvm.internal.cfg.SpringConfiguration">  
     <constructor-arg value="jbpm.cfg.xml" />
    </bean>  
    <bean id="processEngine" factory-bean="jbpmConfiguration" factory-method="buildProcessEngine" />
    把从官方下载的压缩包里的jbpm.hibernate.cfg.xml、jbpm.cfg.xml、jbpm.mail.templates.examples.xml3个xml文件放入src中。
     然后再修改jbpm.hibernate.cfg.xml文件中的数据库连接信息。
    其次strtus2的action文件中添加private SpringConfiguration jbpmConfiguration;并设定其get、set方法。
    在处理方法中添加:
     ProcessEngine processEngine = jbpmConfiguration.buildProcessEngine();
    RepositoryService repositoryService = processEngine.getRepositoryService();
    String deploymentId = repositoryService.createDeployment()
       .addResourceFromClasspath("****.jpdl.xml").deploy();
    repositoryService.deleteDeployment(deploymentId);
    这里的****是需要发布的jbpm流程文件名。

jBPM4与Spring的集成


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论