SSH框架集成JBPM4.4

近期,由于项目要求,需要使用工作流框架,开发基于工作流的业务模块。经过一翻考察,最终还是决定使用jbpm4.4。尽管此时jbpm5.1已经发布,但相对与jbpm4改动太大、资料甚少。且jbpm之父Tom Baeyens已经出走jboss,去了另一家公司,在jbpm4的基础上开发了一个叫activiti5的工作流框架。因此,以后要想升级,也可往activiti发展。

由于是在原有系统上集成jbpm4.4,这就要求尽量不要打破原系统的生态规则。能达到对修改封闭,对扩展开放,那是最理想的状态。虽然不能做到完全封闭,但我一直是基于这个原则做的集成,尽量少修改。

下面让我们来正式开工吧!

首先介绍一下原系统使用的技术:struts1.2.9+spring2.5.6+hibernate3.2.5+tomcat5.5+Oracle10g

struts的action使用spring的Ioc容器管理。hibernate的sessionFactory也是放在Ioc容器里,且使用AnnotationSessionFactoryBean创建。对象关系基于annotation的方式映射。介绍到此,大家应该大概了解了原系统的开发环境。该环境已在客户那里正式运行生产,现在就是要在该环境中,集成jbpm4.4。

集成步骤

1.到官网下载jbpm-4.4.zip。

2.将jbpm4.4必须包导入项目中。如果懒就将全部包导入项目,但不推荐这么做,因为会有很多重复包,可能会造成一些莫明其妙的问题。至于哪些是必需包,可以参考:http://yuanlg.iteye.com/blog/1114842

另由于jbpm4内部使用hibernate做的持久化,而hibernate所需的包,在原系统已经导入,所以hibernate依赖的包,就不用导入了。

3.众所周知,对jbpm4的操作,都需要由ProcessEngine这个类做为入口。因此,得到这个类,就能直接访问jbpm4提供的各种服务。我们将jbpm4集成到spring,也是拿这个类做为入口。只要能得到这个类的bean对象,集成就算成功了。幸好,jbpm4.4已提供了集成到spring的方案。网上有很多集成方案有一些是自己写的,有一些是jbpm4早期版本提供的。到4.3版本,官方提供的是使用SpringHelper来做集成。

 只要将以下bean配制放到applicationContext.xml里,就算是集成完成了。

 <bean id="springHelper" class="org.jbpm.pvm.internal.processengine.SpringHelper">
      <property name="jbpmCfg" value="spring.jbpm.cfg.xml"></property>
</bean>
<bean id="processEngine" factory-bean="springHelper" factory-method="createProcessEngine"/>
 上面的spring.jbpm.cfg.xml可以将\jbpm-4.4\install\src\cfg\jbpm\spring.jbpm.cfg.xml复制到项目的src目录下。
 细心的人可能会打开spring.jbpm.cfg.xml这个文件看看,发现里面有以下配制,甚是疑问!!!
 <string name="spring.cfg" value="applicationContext.xml" />
 我当初也不懂这是什么意思,后面根踪源代码才发现,这个配制完全可以删除。于是我将它删除了。当然,你也可以不用删,完全没影响。
 以下是使用这个配制的源代码,贴同来,供参考!
    if (configuration.isInstantiatedFromSpring()) {
      applicationContext = (ApplicationContext) configuration.getApplicationContext();
        //(略)……
    } else {
      String springCfg = (String) configuration.getProcessEngineWireContext().get("spring.cfg");
      if (springCfg==null) {
        springCfg = "applicationContext.xml";
      }
      applicationContext = new ClassPathXmlApplicationContext(springCfg);
      springProcessEngine = (SpringProcessEngine) applicationContext.getBean("processEngine");
    }
 意思是:当我们直接new SpringHelper对象,并调用createProcessEngine()方法时,它会找到applicationContext.xml来初始化一个applicationContext。
 而如果将SpringHelper交给spring Ioc容器创建时,它就不需要自已去初始化applicationContext,因为SpringHelper实现了ApplicationContextAware接口,spring会自动将applicationContext对象注入进来。
 在这里,我们肯定是将SpringHelper交给spring Ioc容器创建。所以spring.cfg这个配制根本用不上。
 4.初始化数据库。
 在\jbpm-4.4\install\src\db\create目录下,有相应数据库的sql脚本。找到适合你的脚本,执行,初始化数据库便成功了。
 不可否认,这里提供的sql脚本的确有点少。连DB2、sql server的都没有提供。
 5.配制jbpm4的对象关系映射
 jbpm4使用hibernate做持久化,而hibernate在原系统中已与spring集成好。因此,只需要将jbpm4的hbm文件加入sessionFactory bean配制中就可以了。将以下配制加入sessionFactory bean中。
<property name="mappingLocations"> 
 <list> 
  <value>classpath:jbpm.execution.hbm.xml</value> 
  <value>classpath:jbpm.history.hbm.xml</value> 
  <value>classpath:jbpm.identity.hbm.xml</value> 
  <value>classpath:jbpm.repository.hbm.xml</value> 
  <value>classpath:jbpm.task.hbm.xml</value> 
 </list> 
</property>
 这些jbpm.*.hbm.xml文件,在jbpm.jar里面。因此,加上classpath前缀,强制从类路径里查找资源。
 至此,大功告成,集成完毕。
 现在,该怎么使用呢?很简单,在你需要使用jbpm4的类里,声明一个processEngine属性,并写上相应的setter/getter方法。在spring bean配制文件里,将processEngine对象注入进来,便可以使用jbpm4提供的各种服务了。
 在实际项目中,我还加入了以下配制,当需要哪个服务时,便注入哪个服务对象。这样也算是解藕吧!呵呵……
 <bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/>
 <bean id="executionService" factory-bean="processEngine" factory-method="getExecutionService"/>
 <bean id="taskService" factory-bean="processEngine" factory-method="getTaskService"/>
 <bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService"/>
 
谨以此文献给正在摸索如何将jbpm4.4集成到spring的同行开发者们。

JBPM 的详细介绍:请点这里
JBPM 的下载地址:请点这里

相关推荐