jbpm通过spring整合到项目里

1.     jBPM4.4应用

1.1. Spring集成(jBPM4.4 Developers Guide, Chapter 17. SpringIntegration

1.1.1.    jbpm.cfg.xml

1,删除配置:<importresource="jbpm.tx.hibernate.cfg.xml" />

2,增加配置:<import resource="jbpm.tx.spring.cfg.xml"/>

1.1.2. applicationContext.xml中配置

<!-- 配置ProcessEngine(整合jBPM4 -->

<!--jbpmCfg是相对于classpath的相对路径,默认值为jbpm.cfg.xml -->

<beanid="springHelper"

class="org.jbpm.pvm.internal.processengine.SpringHelper">

    <property name="jbpmCfg"value="jbpm.cfg.xml"></property>

</bean>

<beanid="processEngine" factory-bean="springHelper"

factory-method="createProcessEngine" />

1.1.3.  测试

@Test // 测试ProcessEngine

publicvoid testProcessEngine() {

    ProcessEngine processEngine =(ProcessEngine)ac.getBean("processEngine");

    Assert.assertNotNull(processEngine);

}

 

1.1.4.  注意事项

如果做了JBPM4.4Spring整合(使用了jbpm.tx.spring.cfg.xml),则在程序中就一定要使用Spring注入ProcessEngine,千万不能使用Configuration.getProcessEngine()生成ProcessEngine,因为这时内部的代码有以下逻辑:如果整合了Spring但没有ApplicationContext,就默认读取applicationContext.xml创建ApplicationContext实例并从中获取名为”ProcessEngine”的对象。而这时如果把pe =Configuration.getProcessEngine()写成某Spring中管理的bean的初始化代码,就会有无限循环,不停的创建ApplicationContext了!

1.2. 自行控制事务

1, 修改 jbpm.tx.hibernate.cfg.xml

a)        不让jBPM自行管理事务:去掉<standard-transaction-interceptor/>

b)       Jbpm使用SessionFactory.getCurrentSession():修改为 <hibernate-sessioncurrent="true" />

2, 配置可以使用SessionFactory.getCurrentSession(),在jbpm.hibernate.cfg.xml 中配置:<propertyname="hibernate.current_session_context_class">thread</property>

3, 要使用同一个SessionFactory,且都要使用 SessionFactory.getCurrentSession() 获取 Session

a)        同一个SessionFactorySessionFactory sf = processEngine.get(SessionFactory.class)

b)        BaseDaoImpl 中增加:

                       i.             getSession() { returnHibernateUtils.getSessionFactory().getCurrentSession(); }

                     ii.             getProcessEngine(){ returnorg.jbpm.api.Configuration.getProcessEngine(); }

4, 统一的打开与提交或回滚事务:使用 OpenSessionInViewFilter 控制事务。

 

1.3. 启动Tomcat后,访问JSP时(使用的是MyEclipse自带的Tomcat,是6.0的版本),报错:   Caused by: java.lang.LinkageError: loaderconstraints violated when linking javax/el/ExpressionFactory class

       atorg.apache.jsp.WEB_002dINF.jsp.UserAction.loginUI_jsp._jspInit(loginUI_jsp.java:39)

       atorg.apache.jasper.runtime.HttpJspBase.init(HttpJspBase.java:52)

       atorg.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:159)

       atorg.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:329)

       atorg.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)

       atorg.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)

       ...40 more

      

       说明:原因是Jbpmjuel.jar, juel-engine.jar,juel-impl.jar包和Tomcat6.0中的el-api.jar包冲突了。

       有三个解决办法:

       1,方法一:在MyEclipsePreferences -> MyEclipse ->Application Servers -> Tomcat -> .. -> Paths 中配置 Append to classpath,选中 juel.jar, juel-engine.jar,juel-impl.jar 这三个jar包就可以了。

       2,方法二:将 juel.jar, juel-engine.jar,juel-impl.jar 这三个包复制到tomcat6 lib/ 中,并删除原来的el-api.jar

       切记还要把工程中 WEB-INF\lib 下的 juel.jar, juel-engine.jar,juel-impl.jar 删除,不然还是要冲突。

       3,方法三:换成tomcat5.5,就没有问题了。

      

1.4. 完成流程实例中的最后一个任务时报错(任务实例结束时),或删除流程定义级联删除流程实例时,报错如下:

com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException:Cannot delete or update a parent row: a foreign key constraint fails(`itcastoa_20100909/jbpm4_execution`, CONSTRAINT `FK_EXEC_INSTANCE` FOREIGN KEY(`INSTANCE_`) REFERENCES `jbpm4_execution` (`DBID_`))

 

解决办法:把方言设为MySQL5InnoDBDialect,不能是 MySQLDialect

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值