浅谈jBPM4与Spring整合的2种方式

开发 后端
要知道如何将jBPM4与Spring整合,可以先了解jBPM4的IOC容器,本文将简单介绍下jBPM4与Spring整合的2种方式。

如果不了解jBPM4的IOC容器,可以先看ronghao的这篇文章http://www.javaeye.com/topic/381607,是介绍jBPM4的IOC容器的。下面我们介绍jBPM与Spring整合的2种方式:

第一种:手工将SessionFactory放入jBPM4中。

第1步:更改jbpm.spring.default.cfg.xml配置文件,将下面的部分注释掉

  1. <!--  
  2. <hibernate-configuration> 
  3. <cfgresourcecfgresource="jbpm.hibernate.cfg.xml"/> 
  4. </hibernate-configuration> 
  5.  
  6. <hibernate-session-factory/> 
  7. --> 

注释的部分是在jBPM4中创建了sessionFactory,而我们只需要一个sessionFactory。既然要将jBPM4与Spring的整合,那就希望由Spring来统一管理sessionFactory和事务,在Spring的配置文件中构造一个sessionFactory。ProcessEngine是jBPM4的Facade模式,一切由它与外部交互,

第2步:在Spring配置文件中写一个bean:

  1. <beanidbeanid="processEngine"class="com.family168.jbpm.ProcessEngineFactoryBean"> 
  2. <propertynamepropertyname="sessionFactory"ref="sessionFactory"/> 
  3. </bean> 

第3步:在ProcessFactoryBean中注入SessionFactory:

  1. publicvoidsetSessionFactory(SessionFactorysessionFactory){  
  2. this.sessionFactory=sessionFactory;  

第4步:在ProcessFactoryBean中创建一个SpringConfiguration,然后将sessionFactory放入SpringConfiguration中,再从SpringConfiguration得到processEngine,代码如下:

  1. publicvoidafterPropertiesSet(){  
  2. SpringConfigurationcfg=newSpringConfiguration(jbpmConfigurationLocation);  
  3. cfg.setApplicationContext(applicationContext);  
  4.  
  5. cfg.setSessionFactory(sessionFactory);  
  6. this.processEngine=cfg.buildProcessEngine();  

然后我们的工作就可以开展了,可以从processEngine得到所有的service。比如:

  1. ProcessEngineprocessEngine=(ProcessEngine)ctx.getBean("processEngine");  
  2. RepositoryServicerepositoryService=processEngine.getRepositoryService();  


第2种:获得Hibernate的SessionFactory。

第1步:与第一种方式的第1步一样。

第2步:更改jbpm.tx.spring.cfg.xml配置文件:

将<standard-transaction-interceptor/>改成<spring-transaction-interceptorcurrent="true"/>然后将<transaction/><hibernate-session/>改成<hibernate-sessioncurrent="true"/>这部分修改是将jBPM4创建的spring事务和hibernate的session改成从当前的ThreadLocal中获得session和事务。

第3步:在Spring配置文件中写bean,processEngine和template:

  1. <beanidbeanid="jbpmConfiguration"class="org.jbpm.pvm.internal.cfg.SpringConfiguration"> 
  2. <constructor-argvalueconstructor-argvalue="jbpm/jbpm.cfg.xml"/> 
  3. </bean> 
  4.  
  5. <beanidbeanid="processEngine"factory-bean="jbpmConfiguration"factory-method="buildProcessEngine"/> 
  6.  
  7. <beanidbeanid="jbpmTemplate"class="com.family168.jbpm.JbpmTemplate"> 
  8. <propertynamepropertyname="processEngine"ref="processEngine"/> 
  9. <propertynamepropertyname="dataSource"ref="dataSource"/> 
  10. </bean> 

processEngine直接使用factory-bean指向jbpmConfiguration,也就是org.jbpm.pvm.internal.cfg.SpringConfiguration,并从SpringConfiguration的buildProcessEngine中获得。

jbpmTemplate主要是控制事务,在processEngine外面创建事务,这样使用的时候会先调用jbpmTemplate,再调用processEngine,否则它会说事务没有启动。在jbpmTemplate中注入processEngine:

  1. publicvoidsetProcessEngine(ProcessEngineprocessEngine){  
  2. this.processEngine=processEngine;  

这里我的理解是我们在上面已经将事务改成从当前的Threadlocal中获得,所以jBPM4是必须当前有事务,如果我没有创建事务的话,在使用processEngine时就会说事务没有启动。所以我们就封装了一个jbpmTemplate,如果我的理解有误还请大家指出。

第1种整合方式我会提供一个例子,第2种整合方式之后可以看我们的jBPM-Side里的控制台。

【编辑推荐】

  1. Struts2教程:拦截器概述
  2. Struts2教程:上传任意多个文件
  3. Struts2教程:在Action类中获得HttpServletResponse对象
  4. Struts2教程:使用Validation框架验证数据
  5. Struts2教程:使用validate方法验证数据
责任编辑:彭凡 来源: javaeye
相关推荐

2009-06-24 14:57:03

jBPM4架构

2009-06-25 17:13:51

jBPM与Spring

2009-06-26 13:51:49

jBPM4高级图形执行

2009-06-26 09:15:31

jBPM4基本活动

2009-06-26 09:32:35

jBPM4基本活动

2009-06-23 15:30:20

jBPMMySQL

2009-03-06 14:34:31

StrutsHibernateSpring

2009-06-01 10:28:03

SpringOSGi整合

2009-06-23 18:18:13

SpringHibernate

2011-11-25 10:25:27

SpringJava

2009-06-19 18:26:38

Spring事务配置

2012-07-17 09:16:16

SpringSSH

2011-02-28 13:51:30

Spring事物配置

2009-07-09 18:24:00

WebWork与Spr

2009-07-14 14:41:33

Webwork与Spr

2011-02-28 11:19:12

双绞线布线

2014-12-31 14:09:23

xml解析

2018-04-28 15:51:33

Mybatis方式传递

2020-02-10 15:50:18

Spring循环依赖Java

2023-01-13 07:41:20

BeanSpring容器
点赞
收藏

51CTO技术栈公众号