浏览 300 次
|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2008-04-01 关键字: 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);
}
}
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
| 返回顶楼 | |
|
时间:2008-04-28
你好,我也遇到了这个问题,请问你怎么用这个DbPersistenceService,DbPersistenceServiceFactory,我是JBPM新手,请指教,谢谢!
|
|
| 返回顶楼 | |


