转载自:http://superleo.iteye.com/blog/323400
Spring 和 jbpm 整合还是挺复杂的,我把整合的过程以及遇到的一些问题和大家共同分享一下,有不当之处,希望大家指正。我的开发环境是xp3,我所用到的框架版本如下:
struts2.0.11并且降级支持JDK1.4
spring2.0,
spring-modules-jbpm31-0.6.jar
jbpm3.1.4
hibernate.3.2.3
附件就是源码,请参照里面的readme.txt进行相应的配置。
在 Spring 中配置 jbpm 所使用的 SessionFactory
Spring 其它该怎么配还是怎么配置,对于 jbpm 所依赖的 sessionFactory ,我是这么配置的:
- <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="dataSource">
- <ref bean="dataSource" />
- </property>
- <property name="mappingLocations">
- <list>
- <!-- jbpm's hbm.xml -->
- <value>classpath*:/org/jbpm/**/*.hbm.xml</value>
- <!-- other hbm.xml -->
- <value>classpath*:/com/resoft/system/domain/*.hbm.xml</value>
- </list>
- </property>
- <property name="hibernateProperties">
- <props>
- <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
- <prop key="show_sql">true</prop>
- <prop key="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</prop>
- </props>
- </property>
- </bean>
我看有的喜欢将配置
- <property name="mappingLocations">
- <list>
- <!-- jbpm's 的hbm.xml -->
- <value>classpath*:/org/jbpm/**/*.hbm.xml</value>
- <!-- 其它地方自己配置的 hbm.xml -->
- <value>classpath*:/com/resoft/system/domain/*.hbm.xml</value>
- </list>
- </property>
配置成:
- <property name="configLocations">
- <list>
- <value>classpath:/hibernate.cfg.xml</value>
- ......
- </list>
- </property>
其实也行,不过hibernate.cfg.xml 文件对于后续的 spring 和 jbpm 整合也没有多大用处,尽量争取统一在一处配置即可。下面还会有详细说明。
还有一点就是本 demo 是一个很简单的整合实例,所以其它的 PO 对象所对应的表也和 jbpm 放在一起。实际用的时候,可能需要配置多个数据源,多个 sessionFactory ,并用 JTA 来进行全局事务处理。
开始在 Spring 中配置 jbpm
请注意,现在才是配置的开始,继续在spring的xml中配置
- <!-- 关于jbpmConfiguration的配置 -->
- <bean id="jbpmConfiguration" class="org.springmodules.workflow.jbpm31.LocalJbpmConfigurationFactoryBean">
- <property name="sessionFactory" ref="sessionFactory" />
- <property name="configuration" value="classpath:jbpm.cfg.xml" />
- <!-- 第一处需要注意的地方 -->
- <property name="processDefinitions">
- <list>
- <ref local="holidayWorkflow" />
- </list>
- </property>
- <!-- 没什么好说的,是否需要重新建表 -->
- <property name="createSchema" value="${jbpmConfiguration.createSchema}" />
- </bean>
- <bean id="holidayWorkflow" class="org.springmodules.workflow.jbpm31.definition.ProcessDefinitionFactoryBean">
- <!-- 第二处需要注意的地方 -->
- <property name="definitionLocation" value="classpath:jbmp/workflow/holiday/holiday.zip" />
- </bean>
- <bean id="holidayTemplate" class="org.springmodules.workflow.jbpm31.JbpmTemplate">
- <constructor-arg index="0" ref="jbpmConfiguration" />
- <!-- 第三处需要注意的地方 -->
- <constructor-arg index="1" ref="holidayWorkflow" />
- </bean>
先看
- <!-- 第一处需要注意的地方 -->
- <property name="processDefinitions">
- <list>
- <ref local="holidayWorkflow" />
- </list>
- </property>
这样配置后,每次重新启动的时候,都会重新发布 list 里的流程,开发的时候建议这么做。
再看
- <!-- 第二处需要注意的地方 -->
- <property name="definitionLocation" value="classpath:jbmp/workflow/holiday/holiday.zip" />
以前整合过的人非常奇怪我这个地方怎么是一个 zip ,而不是什么 processdefinition.xml 文件之类的。最开始的时候,我下载了 javaeye中某个人写的代码,里面说流程发布一定要通过插件发布,不能通过代码, 后来慢慢在自己摸索中发现,这是 springmodule 的一个不完善的地方。所谓的插件形式发布,我看了代码,就是调用一个执行上传 zip 包的 servlet 。然后再通过 jbpm 的 API 将 zip 包中的gpd.xml , processdefinition.xml , processimage.jpg 解析发布,最后可以在页面使用 jbmp 自带的 jsp tag 标签 ( 可以随便修改 ) ,将 processimage.jpg 所在流程的正确位置显示出来。
好了,下载 spring-module-jbmp3.1 的源码打开
org.springmodules.workflow.jbpm31.definition. ProcessDefinitionFactoryBean 类,大概在第 56 行左右的地方,将