Spring, Springmodules, JBPM持久化集成--摆脱LazyInitializationException(Part1) Spring, Springmodules, JBPM持久化集成理解系列三
【本系列如需转载,请注明作者及出处】
不管Jbpm的持久化策略如何,要重用Spring的持久化集成服务,我们要怎么做呢?Jbpm可以是B/S架构中的一部分,也可以是C/S架构的一部分。对于B/S架构,我们都知道有OpenSessionInViewFilter,然而C/S没有“Filter”,该从何入手呢?
我们先来看看OpenSessionInViewFilter是怎样做到的,本篇不讨论它的优缺点。OpenSessionInViewFilter也是一个javax.servlet.Filter,只不过它还是BeanNameAware,ServletContextAware,InitializingBean和DisposableBean的实现。
像所有的Filter一样,Filter的入口都是
public final void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws ServletException, IOException;
到了OpenSessionInViewFilter这里,执行的方法就是
protected void doFilterInternal(
HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException;
doFilterInternal做的事情说简单也不简单,我们来看该方法做了什么,请留意注释:
protected void doFilterInternal(
HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
//1, 先把SessionFactory取出来。
SessionFactory sessionFactory = lookupSessionFactory(request);
boolean participate = false;
//2.1 如果是设置了isSingleSession为true,则整个request请求中都会只使用一个session。
if (isSingleSession()) {
// single session mode
//2.2 再看看当前线程是不是已经存在一个可用的session
if (TransactionSynchronizationManager.hasResource(sessionFactory)) {
// Do not modify the Session: just set the participate flag.
participate = true;
}
else {
logger.debug("Opening single Hibernate Session in OpenSessionInViewFilter");
//2.3 没有就创建一个
Session session = getSession(sessionFactory);
TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));
}
}
else {
// deferred close mode
//3.1 如果已经延迟关闭策略已经被激活,则什么事情也不做
if (SessionFactoryUtils.isDeferredCloseActive(sessionFactory)) {
// Do not modify deferred close: just set the participate flag.
participate = true;
}
else {
//3.2 如果为false,则激活延迟关闭session策略
SessionFactoryUtils.initDeferredClose(sessionFactory);
}
}
try {
filterChain.doFilter(request, response);
}
finally {
//4.1, filter返回后,如果在进入该filter之前延迟关闭已经被激活,该filter不负责关闭session,
if (!participate) {
if (isSingleSession()) {
// single session mode
SessionHolder sessionHolder =
(SessionHolder) TransactionSynchronizationManager.unbindResource(sessionFactory);
logger.debug("Closing single Hibernate Session in OpenSessionInViewFilter");
closeSession(sessionHolder.getSession(), sessionFactory);
}
else {
//4.2 如延迟关闭是该filter激活的,就在此关闭session
// deferred close mode
SessionFactoryUtils.processDeferredClose(sessionFactory);
}
}
}
}
isSingleSession为false时,也就是延迟关闭策略,应该有一部分会感到很奇怪了,并没有看到session的打开,这时就有必要要探讨一下了HibernateTemplate。HibernateTemplate也是经典的回调模型,它的核心是execute方法。看到这段代码之后,是不是豁然开朗呢? 原来execute里一开始就将session取出来了,执行了callback之后就开始做session的管理了。注意HibernateTemplate里默认是allowCreate = true; alwaysUseNewSession = false;
public Object execute(HibernateCallback action, boolean exposeNativeSession) throws DataAccessException {
Assert.notNull(action, "Callback object must not be null");
Session session = getSession();
/*
*省略一段代码
*/
Object result = action.doInHibernate(sessionToExpose);
/*
*省略一段代码
*/
SessionFactoryUtils.closeSessionOrRegisterDeferredClose(session, getSessionFactory());
}
SessionFactoryUtils.closeSessionOrRegisterDeferredClose(session, getSessionFactory());就像它字面要表达的,如果延迟关闭策略处于激活状态,则只是将session注册到一个容器里,到某个时刻再统一关闭,例如在OpenSessionInViewFilter返回时。
分享到:
相关推荐
spring-modules-jbpm31-0.6.jar,spring整合jbpm的jar包
Spring-Jbpm-JSF-Example.pdf
jbpm-jpdl-suite-3.2GA -(5)分开压缩(共5个文件)jbpm下载 jbpm-jpdl-suite-3.2GA -(5)分开压缩(共5个文件)jbpm下载
JBPM-----PPT 工作流JBPM完整PPT文件。帮你更快速上手。
jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,jbpm-starters-kit-3.1.2插件,共两卷
jbpm-jpdl-designer-site-3.1.7.zip jbpm-jpdl-designer-site-3.1.7.zip jbpm-jpdl-designer-site-3.1.7.zip
jbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3.zipjbpm-jpdl-suite-3.2.3....
jbpm-workitems-5.1.0.Final-sources.jar jbpm5 源码
jbpm-jpdl-suite-3.2.GA.zip
jbpm-bpmn2-5.1.0.Final.jar jbpm5
jbpm-jpdl-suite-3.2.GA.zip
jbpm-flow-builder-5.1.0.Final.jar jbpm5
jbpm-eclipse插件,这个插件随jbpm4.4 一起发布,位于 jbpm-4.4/install/src/gpd 目录下,由于许多人找不到这个包,所有传上来,赚点积分。
jbpm-jpdl-suite-3.2.GA.zip
jbpm-jpdl-designer资源
jbpm-starters-kit-3.1.2.zip官方下载地址 版本里包括一个JBPM流程设计器的Eclipse插件,和一个用JBOSS作为服务器的示例流程等相关文件。解压jbpm-starters-kit-3.1.2.rar到某个特定目录,这里我们首先用到的是包里...
jbpm-installer-3.2.6.GA.jar
jbpm-starters-kit-3.1.2.插件,jbpm-starters-kit-3.1.2.插件,jbpm-starters-kit-3.1.2.插件,jbpm-starters-kit-3.1.2.插件,jbpm-starters-kit-3.1.2.插件,jbpm-starters-kit-3.1.2.插件,jbpm-starters-kit-...
jbpm-workitems-5.1.0.Final.jar jbpm5