2008-04-01

Jbpm的BUG?

关键字: jbpm
我们将Jbpm与Spring整合的过程中发现一个问题,经过晚上的Debug终于找到了问题的原因。

我们使用OpenSessionInView这个拦截器,所以请求结束后Session会被关闭。当再次请求时JBpm就会跑出异常,Session is closed。可是其他部分都很正常,开始以为是什么地方不小心把Session给关了,debug后似乎一切正常。其实这个问题之前作UnitTest时就发现了,不过当时以为是TestCase的配置有问题就没太在意。

然后不得已只能将hibernate的log打开,一行一行的看,结果发现DbPersistenceService中几个Module的Session竟然与DbPersistenceService的不一样。这些终于有头绪了。打开DbPersistenceService的源代码一看,原来DbPersistenceService的setSession方法没有同时设置其它几个Module的Session,晕!这是JBpm的bug吗?!

public class DbPersistenceService implements Service, PersistenceService {

  public void setSession(Session session) {
    this.session = session;
    log.debug("injecting a session disables transaction");
    isTransactionEnabled = false;
  }

}


好在Jbpm设计优秀,可以轻松替换掉这个实现。我做了一个简单的修改override了setSession,问题顺利解决。

public class DbPersistenceService extends
		org.jbpm.persistence.db.DbPersistenceService {

	/**
	 * 
	 */
	private static final long serialVersionUID = -7021022287407291604L;

	public DbPersistenceService(
			DbPersistenceServiceFactory persistenceServiceFactory) {
		super(persistenceServiceFactory);
	}

	@Override
	public void setSession(Session session) {
		super.setSession(session);

		graphSession = null;
		taskMgmtSession = null;
		jobSession = null;
		contextSession = null;
		loggingSession = null;

	}

}


当然还有它的工厂类

public class DbPersistenceServiceFactory extends
		org.jbpm.persistence.db.DbPersistenceServiceFactory {

	private static final Log log = LogFactory.getLog(DbPersistenceServiceFactory.class);

	/**
	 * 
	 */
	private static final long serialVersionUID = 6711179796157080648L;

	@Override
	public Service openService() {
		DbPersistenceServiceFactory.log.debug("creating persistence service");
		return new DbPersistenceService(this);
	}

}
评论
zhu_chen001 2008-05-26
我也到同样的问题而放弃了jbpm,回去看看能否解决问题
yujianqiu 2008-05-26
legend_122,

在Spring的配置文件中配置。下面是我们的配置文件,你可以参考一下。

	<bean id="persistenceServiceFactory" class="com.agfa.he.sh.workflow.impl.DbPersistenceServiceFactory">
		<property name="sessionFactory" ref="mySessionFactory" />
	</bean>

	<bean id="jbpmContext" class="org.jbpm.JbpmContext">
		<constructor-arg index="0">
			<bean class="org.jbpm.svc.Services">
				<constructor-arg index="0">
					<map>
						<entry>
				            <key>
				                <value>persistence</value>
				            </key>
				            <ref bean="persistenceServiceFactory" />
        				</entry>
						<entry>
				            <key>
				                <value>tx</value>
				            </key>
				            <ref bean="txServiceFactory" />
        				</entry>
					</map>
				</constructor-arg>
			</bean>
		</constructor-arg>
		<constructor-arg index="1" ref="jbpmObjectFactory"/>
	</bean>

legend_122 2008-04-28
你好,我也遇到了这个问题,请问你怎么用这个DbPersistenceService,DbPersistenceServiceFactory,我是JBPM新手,请指教,谢谢!
发表评论

提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则

您还没有登录,请登录后发表评论

yujianqiu
搜索本博客
最近加入圈子
最新评论