尝试了将jbpm和spring进行结合,主要参考http://betafox.iteye.com/blog/177649来进行。
Spring, Springmodules, JBPM持久化集成理解系列一
【本系列如需转载,请注明作者及出处】
本系列文章假设阅者具备以下知识:
1,ThreadLocal相关知识
2,Spring持久化,事务管理相关知识
3,Hibernate 持久化相关知识
4,Jbpm 持久化相关知识
5,Springmodules项目相关知识
6,相关J2EE知识
且具备以下材料:
1,Spring源代码
2,Hibernate源代码
3,Jbpm源代码
4,Springmodules源代码
配置文件如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:util="http://www.springframework.org/schema/util"
- xmlns:jee="http://www.springframework.org/schema/jee"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:lang="http://www.springframework.org/schema/lang"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
- http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
- http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
- http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
- http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd"
- default-autowire="byName">
- <bean id="workflow1"
- class="org.springmodules.workflow.jbpm31.definition.ProcessDefinitionFactoryBean">
- <property name="definitionLocation"
- value="classpath:jbpm/processes/processdefinition.xml" />
- </bean>
- <!-- jBPM configuration-->
- <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="workflow1" />
- </list>
- </property>
- <!--
- <property name="createSchema" value="true" />
- <property name="dropSchema" value="true" />
- -->
- </bean>
- <!-- jBPM template -->
- <bean id="jbpmTemplate"
- class="org.springmodules.workflow.jbpm31.JbpmTemplate">
- <constructor-arg index="0" ref="jbpmConfiguration" />
- <constructor-arg index="1" ref="workflow1" />
- </bean>
- </beans>
在casspath下添加了jbpm.cfg.xml,内容是从default.jbpm.cfg.xml中复制过来的:
- <jbpm-configuration>
- <jbpm-context name="default.jbpm.context">
- <service name="persistence"
- factory="org.jbpm.persistence.db.DbPersistenceServiceFactory" />
- <service name="message"
- factory="org.jbpm.msg.db.DbMessageServiceFactory" />
- <service name="scheduler"
- factory="org.jbpm.scheduler.db.DbSchedulerServiceFactory" />
- <service name="logging"
- factory="org.jbpm.logging.db.DbLoggingServiceFactory" />
- <service name="authentication"
- factory="org.jbpm.security.authentication.DefaultAuthenticationServiceFactory" />
- </jbpm-context>
- <!-- 不再使用<string name="resource.hibernate.cfg.xml" value="hibernate.cfg.xml" />-->
- <string name="resource.business.calendar"
- value="org/jbpm/calendar/jbpm.business.calendar.properties" />
- <string name="resource.default.modules"
- value="org/jbpm/graph/def/jbpm.default.modules.properties" />
- <string name="resource.converter"
- value="org/jbpm/db/hibernate/jbpm.converter.properties" />
- <string name="resource.action.types"
- value="org/jbpm/graph/action/action.types.xml" />
- <string name="resource.node.types"
- value="org/jbpm/graph/node/node.types.xml" />
- <string name="resource.parsers"
- value="org/jbpm/jpdl/par/jbpm.parsers.xml" />
- <string name="resource.varmapping"
- value="org/jbpm/context/exe/jbpm.varmapping.xml" />
- </jbpm-configuration>
在配置过程中也遇到了一些问题。
问题一:系统报找不到 default.jbpm.context。
解决方法:在自己的jbpm.cfg.xml中设置
- jbpm-context name="default.jbpm.context"
jbpm-context name="default.jbpm.context"
问题二:系统报找不到hibernate.cfg.xml。
解决方法:我的系统里hibernate配置放在spring的配置文件里,没有使用hibernate.cfg.xml。跟踪DbPersistenceServiceFactory和LocalJbpmConfigurationFactoryBean.afterPropertiesSet发现问题出在jbpmContext构建时需要获取持久层,如果sessionFactory存在则不会去读取hibernate.cfg.xml,除了在配置jbpmConfiguration时要设置sessionFactory外,如果jbpm的数据库表已经存在,则不要设置createSchema和dropSchema否则会报错。按上面的配置文件设置后,不会再去读取hibernate.cfg.xml,可以注释掉jbpm.cfg.xml中的resource.hibernate.cfg.xml。
注意:如果使用这种配置方式,省略了hibernate.cfg.xml文件,但如果调用jbpmConfiguration.createSchema();jbpmConfiguration.dropSchema();等方法还是会出错,跟踪源码可以发现这些方法都会调用DbPersistenceServiceFactory.getConfiguration()方法,这个方法会去读取hibernate.cfg.xml。我们可以使用jbpm-db\build\mysql\scripts\下的脚本手工创建或删除数据库,这在做单元测试时稍显麻烦。
问题三:jbpm-identity中有User.hbm.xml,这个名称与我系统中原有的User.hbml.xml冲突,尽管他们不在同一个包中,但还是产生了冲突。只能调整一下自己的代码了。
spring配置文件中配置流程定义的xml有些多余,反而使系统在启动的时候更新数据库里的流程定义。完全可以将流程部署到数据库。JbpmTemplate有无参数的构造器,可以不使用构造器注入,只需要在spring配置文件中注它的jbpmConfiguration属性就可以了。
另,没有添加参考文章里说的过滤器,暂时没发现问题。
接触JBPM始于两年多前,当时还在广州一个公司实习,公司打算研发ITIL相关的项目,于是就开始知道了工作流,也就开始接触了JBPM一,SpringModules与JBPM的集成
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:jee="http://www.springframework.org/schema/jee"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
- http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">
- <!-- framework's contexts -->
- <bean id="resource.PropertyConfigurer"
- class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="locations">
- <list>
- <value>classpath:jdbc.properties</value>
- </list>
- </property>
- </bean>
- <!-- JNDI DataSource for J2EE environments -->
- <!--jee:jndi-lookup id="dataSource" jndi-name="java:/comp/env/jdbc/moss" /-->
- <bean id="resource.DataSource"
- class="org.apache.commons.dbcp.BasicDataSource"
- destroy-method="close">
- <property name="driverClassName"
- value="${appserver.jdbc.driverClassName}" />
- <property name="url" value="${appserver.jdbc.url}" />
- <property name="username" value="${appserver.jdbc.username}" />
- <property name="password" value="${appserver.jdbc.password}" />
- <property name="maxActive" value="${appserver.jdbc.maxActive}" />
- <property name="maxIdle" value="${appserver.jdbc.maxIdle}" />
- <property name="maxWait" value="${appserver.jdbc.maxWait}" />
- <property name="defaultAutoCommit"
- value="${appserver.jdbc.defaultAutoCommit}" />
- <property name="removeAbandoned"
- value="${appserver.jdbc.removeAbandoned}" />
- <property name="removeAbandonedTimeout"
- value="${appserver.jdbc.removeAbandonedTimeout}" />
- </bean>
- <!-- Hibernate SessionFactory -->
- <bean id="resource.SessionFactory"
- class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="dataSource" ref="resource.DataSource" />
- <property name="configLocations">
- <list>
- <value>classpath*:hibernate.cfg.xml</value>
- </list>
- </property>
- </bean>
- <!-- jBPM configuration -->
- <bean id="resource.JbpmConfiguration"
- class="org.springmodules.workflow.jbpm31.LocalJbpmConfigurationFactoryBean">
- <property name="configuration" value="classpath:jbpm.cfg.xml" />
- <property name="createSchema" value="false" />
- <property name="sessionFactory">
- <ref local="resource.SessionFactory"/>
- </property>
- </bean>
- <!-- jBPM template -->
- <bean id="resource.JbpmTemplate"
- class="org.springmodules.workflow.jbpm31.JbpmTemplate">
- <constructor-arg index="0" ref="resource.JbpmConfiguration" />
- </bean>
- </beans>
LocalJbpmConfigurationFactoryBean
最重要的就是LocalJbpmConfigurationFactoryBean了,相信Spring的用户对这样的Bean都很熟悉。根据jbpmConfiguration配置文件和提供的sessionFactory,它会创建一个可以与提供的流程定义协同工作的jBPM Configuration。sessionFactory属性可有可无,如果提供了,将会使用sessionFactory提供的session进行数据库操作。但是如果注入了sessionFactory,就可以重用Spring提供的事务管理架构,且不需要对jBPM做任何代码修改,还可以结合使用OpenSessionInView模式,好处显而易见吧。
JbpmTemplate and JbpmCallback
像Spring与Hibernate,JDBC的集成有相应的Template, Callback类一样,Spring与Jbpm的集成也有JbpmTemplate和JbpmCallback,且默认提供了一些便利方法供用户使用,例如findProcessInstance,findPooledTaskInstances,saveProcessInstance,signal等。
因为JbpmTemplate继承了JbpmAccessor,父类JbpmAccessor实现了InitializingBean,所以Spring在初始化这个JbpmTemplate时会调用afterPropertiesSet方法来配置JbpmTemplate所使用到的HibernateTemplate。JbpmAccessor 还做了一些访问异常的转换操作。
这两个类协同起来要完成的事情是,如果提供了SessionFactory或者
HibernateTemplate, 在JbpmCallback里的doInJbpm方法之前注入SessionFactory提供的hibernate session。如果没有提供SessionFactory,那么持久化的操作还是交回给Jbpm。如果存在SessionFactory, session的打开,关闭就由SessionFactory管理。否则由JBPM自身的持久化逻辑来维护。
这部分逻辑可以查看HibernateTemplate的execute方法:
- public Object execute(final JbpmCallback callback) {
- final JbpmContext context = getContext();
- try {
- // use the hibernateTemplate is present and if needed
- if (hibernateTemplate != null && hasPersistenceService) {
- // use hibernate template
- return hibernateTemplate.execute(new HibernateCallback() {
- /**
- * @see org.springframework.orm.hibernate3.HibernateCallback#doInHibernate(org.hibernate.Session)
- */
- public Object doInHibernate(Session session) throws HibernateException, SQLException {
- // inject the session in the context
- context.setSession(session);
- return callback.doInJbpm(context);
- }
- });
- }
- // plain callback invocation (no template w/ persistence)
- return callback.doInJbpm(context);
- }
- catch (JbpmException ex) {
- throw convertJbpmException(ex);
- }
- finally {
- releaseContext(context);
- }
- }
现在受Spring影响太深了,接触什么项目想到的首先就是尝试和Spring集成。接触JBPM也不例外,不过与JBPM和Spring的集成,已经有人做了,这个项目就是SpringModules-jbpm了,而且做的很优雅,充分体现了Spring提倡的Inversion of Control的美。
我尝试将这种美表述出来与大家分享,首先我会摘取Spring Modules手册里与JBPM集成的部分内容。跟着会引用一部分JBPM的手册里的相关章节和阅读一部分相关代码分析SpringModules集成的原理。最后谈一谈JBPM持久化与Spring事务管理的集成。相信能够让困惑于LazyLoading的朋友一些有益的启示。
相关推荐
8. **集成能力**: jbpm3.1 API设计得十分灵活,易于与其他系统集成,例如Spring框架、EJB等,使得它在企业级应用中广泛应用。 在"jbpm3.1中文文档.chm"中,你将找到详细的API文档,包括方法说明、示例代码和使用...
【jbpm3.1中文文档】是一份详细阐述jbpm工作流程引擎的资源,它包含了大量的信息,旨在帮助用户理解和掌握jbpm 3.1版本的核心功能和使用方法。jbpm是一个开源的工作流程管理系统,它提供了强大的业务流程建模、执行...
jbpm3.1中文文档 .chm 博文链接:https://xinlingwuyu.iteye.com/blog/213351
### jBPM 3.1 相关知识点 #### 一、引言 jBPM 3.1 是一个开放源代码的工作流引擎,由 JBoss 提供支持,旨在简化业务流程管理(BPM)任务。它提供了一整套工具和服务来支持流程的设计、部署、执行和监控。 #### 二...
JBPM3.1是JBPM的一个早期版本,尽管现在已经有了更先进的版本,但对于学习工作流管理和流程自动化来说,它仍然是一个很好的起点。 在JBPM3.1中,开发请假流程应用是一项常见的任务。网上虽然有很多关于请假流程的...
jbpm3.1中文文档.chm,有部份内容还是英文,不过还是比较容易看
jbpm3.1-uml.rar 是一个包含与JBoss Business Process Management (BPM)平台相关的UML模型的压缩包。JBPM是一个开源的企业级BPM系统,它允许开发者设计、执行和管理业务流程。这个压缩包特别关注的是将UML(统一建模...
在描述中提到的链接"http://panyongzheng.iteye.com/blog/1872035"可能是一个博客文章或者教程,提供了关于如何配置和整合这些技术的详细指导。这个链接可以作为学习和参考的资源。 从压缩包子文件的文件名称列表...
把这些操作绑在一起,, JBoss jBPM 就有了最强大和易扩展性的控制流机制. JBoss jBPM 只有最小的倚赖性可以很容易的作为java库来使用.当然它也可以用在吞吐量极为关键的J2EE 群应用服务器环境中. JBoss jBPM 可以...
把这些操作绑在一起,, JBoss jBPM 就有了最强大和易扩展性的控制流机制. JBoss jBPM 只有最小的倚赖性可以很容易的作为java库来使用.当然它也可以用在吞吐量极为关键的J2EE 群应用服务器环境中. JBoss jBPM 可以...
### jbpm4.3与Spring框架的整合指南 在企业级应用开发中,流程管理引擎JBPM(JBoss Business Process Management)与Spring框架的结合使用是常见的一种技术方案。JBPM是一个灵活、强大的业务流程管理工具,而Spring...
工作流JBPM中文教程,是直译过来的.感兴趣的就
8. **spring-modules-jbpm31.jar**:这个 JAR 文件很可能是 Spring 与 JBPM 3.1 版本的集成组件,包含了必要的桥接和适配器类,以便于在 Spring 环境中使用 JBPM。 9. **readme.txt**:这个文件通常包含集成指南、...