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

skyfly2424 2008-04-25

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

问题描述:

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

系统正常运行!

当在JBPM引擎中增加了Timer节点(定时任务),并在web.xml中增加了相应的servlet进行调度器的启动,参考如下帖子:http://yang52081.javaeye.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的过滤器来创建的,所以后会拿不到.
感谢回帖..
继续等待...

相关讨论