zoukankan      html  css  js  c++  java
  • JBPM4.4_jBPM4.4应用(与Spring集成&自行控制事务等)

    1. jBPM4.4应用

    1.1. 与Spring集成(jBPM4.4 Developers Guide, Chapter 17. Spring Integration)

    1.1.1. 在jbpm.cfg.xml中

    1,删除配置:<import resource="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 -->

    <bean id="springHelper"

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

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

    </bean>

    <bean id="processEngine" factory-bean="springHelper" factory-method="createProcessEngine" />

    1.1.3. 测试

    @Test // 测试ProcessEngine

    public void testProcessEngine() {

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

      Assert.assertNotNull(processEngine);

    }

    1.1.4. 注意事项

    如果做了JBPM4.4与Spring整合(使用了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-session current="true" />

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

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

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

    b) 在 BaseDaoImpl 中增加:

    i. getSession() { return HibernateUtils.getSessionFactory().getCurrentSession(); }

    ii. getProcessEngine(){ return org.jbpm.api.Configuration.getProcessEngine(); }

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

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

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

    at org.apache.jasper.runtime.HttpJspBase.init(HttpJspBase.java:52)

    at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:159)

    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:329)

    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)

    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)

    ... 40 more

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

    有三个解决办法:

    1,方法一:在MyEclipse的Preferences -> 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-INFlib 下的 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。

  • 相关阅读:
    170516、ActiveMQ 的安装与使用(单节点)
    170515、mybatis批量操作
    170512、java日志文件log4j.properties配置详解
    170511、Spring IOC和AOP 原理彻底搞懂
    170510、数据库默认隔离级别
    170509、文本编辑器编写的shell脚本在linux下无法执行的解决方法
    170508、忘记jenkins密码或者修改jenkins密码
    170505、MySQL的or/in/union与索引优化
    170504、MongoDB和MySQL对比(译)
    Jenkins Android 打包
  • 原文地址:https://www.cnblogs.com/justdoitba/p/8001642.html
Copyright © 2011-2022 走看看