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 的下载地址:请点这里