JBPM与SPRING事务整合深度历险之任务调度<<求救SOS>>

skyfly2424 2008-04-25

最近作OA项目,整合了JBPM流程引擎,遇到了一个无法解决的问题,抛出来大家一起研究,希望在这个领域研究有一定水平的朋友能够给与解决!!!

问题描述:

spring 与 jbpm 进行了整合,参考了这个帖子: http://betafox.iteye.com/blog/177649

系统正常运行!

当在JBPM引擎中增加了Timer节点(定时任务),并在web.xml中增加了相应的servlet进行调度器的启动,参考如下帖子:http://yang52081.iteye.com/blog/172222

此时出现了session问题。

问题分析:

1. 在web.xm中我没有增加jbpmFilter过滤器,因为jbpm只是我系统的一个业务功能模块,所以对于它jbpmContext的创建参考springmodules   的 jbpmTemplate 的实现将jbpmcontext对象的控制放在具体业务bo函数的执行期

在web.xml中使用了org.springframework.orm.hibernate3.support.OpenSessionInViewFilter 进行长session管理

2. 在jbpm.cfg.xml文件中 进行了如下配置

 <service name="persistence">
     <factory>
   <bean class="org.jbpm.persistence.db.DbPersistenceServiceFactory">
       <field name="isTransactionEnabled">
        
<false/>
       </field>
       <field name="isCurrentSessionEnabled">
        <true/>
       </field>
      </bean>
     </factory>
    </service>
    
 

测试一切正常, 在执行到bo方法时采用类似jbpmTemplete的回调函数得到新创建的jbpmcontext对象,由于上面的配置 这个对象的使用到的hibernate session  使用当前已经存在的由spring filter 开启的session, 并且不会再给这个session开启事务, 当然这个session 的事务已经由spring 开启了,如果此时将

      <field name="isTransactionEnabled">
        
<true/>           
       </field>

       设置为true , 则导致一个session 开启两次失误的异常。

现在问题是由于JobExecutorServlet 在init 时要开启 任务调度器,而这个调度器在多线程处理job后都会根据DbPersistenceServiceFactory 对象配置信息来创建service 进而打开 hibernate session  来保存数据库操作,此时这个service 工厂配置的是 使用当前session +  不创建事务  , 此时问题出现了, 因为filter 的init 方法在初始化的时候不经过spring的filter,所以当前不会有session,如果想试着创建新的session,hibernate也不允许创建没有事务的session。

我试图将DbPersistenceServiceFactory配置信息改成如下:

    <service name="persistence">
     <factory>
   <bean class="org.jbpm.persistence.db.DbPersistenceServiceFactory">
       <field name="isTransactionEnabled">
        <false/>
       </field>
     
  <field name="isCurrentSessionEnabled">
        <false/>
       </field>
      </bean>
     </factory>
    </service>

这样让jbpm创建jbpmcontext时创建一个新的hibernate session  , 当业务层bo函数在使用这个Jbpmcontext进行保存流程操作时出示死锁,这时存在了两个session (spring创建的 和 jbpm创建的)

问题再现等待解决, 也许是我整合有误,诚信求教!

 

skyfly2424 2008-04-29
是我的问题太简单还是没有人能够解决呢?
skyfly2424 2008-05-25
这个问题到今天还没有解决,但新的开发安排中已经它列入的工作项中,否则如果不解决调度问题,jbpm的异步功能也将形同虚设,但愿一些顺利.
问题解决后回来结贴!
如果期间大家有可行的方法请告诉我,谢谢!
ppig 2008-05-26
可不可以扩展JobExecutorServlet ,让他在创建session之前先创建trasaction?
没用过JobExecutorServlet,呵呵
skyfly2424 2008-05-28
楼上: 调度的session问题是由于每个处理job的子线程需要创建一个新的session,而所有的session都是客户访问时通过spring的过滤器来创建的,所以后会拿不到.
感谢回帖..
     继续等待...
yuyanshan 2008-08-26
这个帖子帖的好呀,真不知道那些说自己将spring和jbpm整合完成的人是怎么做的。要想在SSH上用好JBPM我想事务统一或是说hibernate session统一将是一个大问题。我现在也是碰到这个问题,因为这个问题还没解决所以项目本来要用它的现在也还在考虑中了。楼主有空聊聊,我刚研究jbpm,可以的话指点一下
tigerlg 2008-09-01
JobExecutorServlet 是可以做的,在initWebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(config.getServletContext());
temp =(JbpmTemplate)wac.getBean("jbpmTemplate");
System.out.println("------------"+temp);
jbpmConfiguration=temp.getJbpmConfiguration();
JpbmJobExecutor.setJbpmConfiguration(jbpmConfiguration,temp);
jbpmConfiguration.startJobExecutor();

写一个 JpbmJobExecutor extends JobExecutor.
可以实现事务的统一,但 JobExecutorServlet 是提醒作业,如在每个任务都加上timer,效率是低的,还不如做个quartz
个人观点!
wys06521 2012-06-06
请问,您这个问题解决了吗
Global site tag (gtag.js) - Google Analytics