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。

  • 相关阅读:
    Sql Server 2008卸载后再次安装一直报错
    listbox 报错 Cannot have multiple items selected when the SelectionMode is Single.
    Sql Server 2008修改Sa密码
    学习正则表达式
    Sql Server 查询第30条数据到第40条记录数
    Sql Server 复制表
    Sql 常见面试题
    Sql Server 简单查询 异步服务器更新语句
    jQuery stop()用法以及案例展示
    CSS3打造不断旋转的CD封面
  • 原文地址:https://www.cnblogs.com/justdoitba/p/8001642.html
Copyright © 2011-2022 走看看