Spring, Springmodules, JBPM持久化集成理解系列二
【本系列如需转载,请注明作者及出处】
本系列文章假设阅者具备以下知识:
1,ThreadLocal相关知识
2,Spring持久化,事务管理相关知识
3,Hibernate 持久化相关知识
4,Jbpm 持久化相关知识
5,Springmodules项目相关知识
6,相关J2EE知识
且具备以下材料:
1,Spring源代码
2,Hibernate源代码
3,Jbpm源代码
4,Springmodules源代码
第二部分,Session的关闭: 到了这里,我们就到了验证的最后一部分了,JbpmContext的关闭了。
【位置JbpmContext】
public void close() {
log.debug("closing JbpmContext");
try {
if (services!=null) {
try {
autoSave();
} finally {
services.close();
}
}
} finally {
if (jbpmConfiguration!=null) {
jbpmConfiguration.jbpmContextClosed(this);
}
}
}
也就是说,JbpmContext关闭的时候会产生自动保存,最后关闭services,现在摘取DbPersistenceService的close里面我们关心的逻辑:
【位置DbPersistenceService】
if (mustSessionBeClosed) {
try {
if(session.isOpen()) {
log.debug("closing hibernate session");
session.close();
} else {
log.warn("hibernate session was already closed");
}
} catch (Exception e) {
throw new JbpmPersistenceException("couldn't close hibernate session", e);
}
}
if (mustConnectionBeClosed) {
try {
if ( (connection!=null)
&& (! connection.isClosed())
) {
log.debug("closing jdbc connection");
connection.close();
} else {
log.warn("jdbc connection was already closed");
}
} catch (Exception e) {
throw new JbpmPersistenceException("couldn't close jdbc connection", e);
}
}
总结:
对于情况一,如果提供了session,mustConnectionBeClosed是false,mustSessionBeClosed也是false,所以这种情况Jbpm不会关闭Connection。
对于情况二mustConnectionBeClosed是true,mustSessionBeClosed也是false,所以Jbpm会调用Session.close(),但是关闭一个使用已有Connection打开的Session,在close时的时候是不会关闭实际的Jdbc 连接的。有兴趣的朋友可用自己继续查看相应的Hibernate代码。
SpringModules集成Jbpm,它向JbpmContext提供了Session,那么它就应该负责Session的创建和关闭了,这些事情Springmodules的核心类JbpmTemplate使用了HibernateTemplate,重用了Spring对Hibernate数据库事务的封装。也就能进一步享受Spring的事务管理和延迟加载,也就是OpenSessionInView的便利。
我后来写了一个Junit测试类来验证,附Junit测试代码:
package com.cabernet;
import java.util.List;
import junit.framework.Assert;
import org.jbpm.taskmgmt.exe.TaskInstance;
import org.springmodules.workflow.jbpm31.JbpmTemplate;
public class TestSetUp extends BaseTestCase
{
protected JbpmTemplate jbpmTemplate;
public void test()
{
Assert.assertNotNull(this.jbpmTemplate);
boolean isDebugEnabled = log.isDebugEnabled();
if (isDebugEnabled)
{
log.debug("findTaskInstances");
}
List<TaskInstance> tasks = this.jbpmTemplate.findTaskInstances("bert");
if (tasks != null)
{
if (isDebugEnabled)
{
log.debug("Tasks found, Swimlane: [" + tasks.get(0).getTask()
.getSwimlane().getName() + "].");
}
return;
}
if (isDebugEnabled)
{
log.debug("No tasks found.");
}
}
public JbpmTemplate getJbpmTemplate()
{
return jbpmTemplate;
}
public void setJbpmTemplate(JbpmTemplate jbpmTemplate)
{
this.jbpmTemplate = jbpmTemplate;
}
}
上述Junit 类继承的父类BaseTestCase是AbstractDependencyInjectionSpringContextTests的子类,
启用了与OpenSessionInView一样的数据LazyLoading和JDBC Connection延迟关闭策略。
附件是测试这个这个流程所发生的Log,首先是SessionFactoryUtils打开了Hibernate Session,最后是SessionFactoryUtils关闭了Hibernate Session,符合Jbpm声称的Context哲学。
2008-03-04 00:14:12 DEBUG (SessionFactoryUtils.java:690) - Initializing deferred close of Hibernate Sessions
2008-03-04 00:14:12 DEBUG (SessionFactoryUtils.java:316) - Opening Hibernate Session
2008-03-04 00:14:12 DEBUG (TestSetUp.java:22) - findTaskInstances
2008-03-04 00:14:12 DEBUG (JbpmContextInfo.java:142) - creating jbpm context with service factories '[message, scheduler, logging, persistence, authentication]'
2008-03-04 00:14:12 DEBUG (JbpmContext.java:124) - creating JbpmContext
2008-03-04 00:14:12 DEBUG (HibernateTemplate.java:364) - Found thread-bound Session for HibernateTemplate
2008-03-04 00:14:12 DEBUG (DbPersistenceServiceFactory.java:55) - creating persistence service
2008-03-04 00:14:12 DEBUG (DbPersistenceService.java:303) - injecting a session disables transaction
Hibernate: select taskinstan0_.ID_ as ID1_27_, taskinstan0_.NAME_ as NAME3_27_, taskinstan0_.DESCRIPTION_ as DESCRIPT4_27_, taskinstan0_.ACTORID_ as ACTORID5_27_, taskinstan0_.CREATE_ as CREATE6_27_, taskinstan0_.START_ as START7_27_, taskinstan0_.END_ as END8_27_, taskinstan0_.DUEDATE_ as DUEDATE9_27_, taskinstan0_.PRIORITY_ as PRIORITY10_27_, taskinstan0_.ISCANCELLED_ as ISCANCE11_27_, taskinstan0_.ISSUSPENDED_ as ISSUSPE12_27_, taskinstan0_.ISOPEN_ as ISOPEN13_27_, taskinstan0_.ISSIGNALLING_ as ISSIGNA14_27_, taskinstan0_.ISBLOCKING_ as ISBLOCKING15_27_, taskinstan0_.TASK_ as TASK16_27_, taskinstan0_.TOKEN_ as TOKEN17_27_, taskinstan0_.SWIMLANINSTANCE_ as SWIMLAN18_27_, taskinstan0_.TASKMGMTINSTANCE_ as TASKMGM19_27_ from JBPM_TASKINSTANCE taskinstan0_ where taskinstan0_.ACTORID_=? and taskinstan0_.ISSUSPENDED_<>1 and taskinstan0_.ISOPEN_=1
2008-03-04 00:14:13 DEBUG (HibernateTemplate.java:388) - Not closing pre-bound Hibernate Session after HibernateTemplate
2008-03-04 00:14:13 DEBUG (JbpmContext.java:133) - closing JbpmContext
2008-03-04 00:14:13 DEBUG (Services.java:210) - closing service 'persistence': org.jbpm.persistence.db.DbPersistenceService@1ce663c
Hibernate: select task0_.ID_ as ID1_14_0_, task0_.NAME_ as NAME2_14_0_, task0_.PROCESSDEFINITION_ as PROCESSD3_14_0_, task0_.DESCRIPTION_ as DESCRIPT4_14_0_, task0_.ISBLOCKING_ as ISBLOCKING5_14_0_, task0_.ISSIGNALLING_ as ISSIGNAL6_14_0_, task0_.DUEDATE_ as DUEDATE7_14_0_, task0_.ACTORIDEXPRESSION_ as ACTORIDE8_14_0_, task0_.POOLEDACTORSEXPRESSION_ as POOLEDAC9_14_0_, task0_.TASKMGMTDEFINITION_ as TASKMGM10_14_0_, task0_.TASKNODE_ as TASKNODE11_14_0_, task0_.STARTSTATE_ as STARTSTATE12_14_0_, task0_.ASSIGNMENTDELEGATION_ as ASSIGNM13_14_0_, task0_.SWIMLANE_ as SWIMLANE14_14_0_, task0_.TASKCONTROLLER_ as TASKCON15_14_0_ from JBPM_TASK task0_ where task0_.ID_=?
Hibernate: select swimlane0_.ID_ as ID1_13_0_, swimlane0_.NAME_ as NAME2_13_0_, swimlane0_.ACTORIDEXPRESSION_ as ACTORIDE3_13_0_, swimlane0_.POOLEDACTORSEXPRESSION_ as POOLEDAC4_13_0_, swimlane0_.ASSIGNMENTDELEGATION_ as ASSIGNME5_13_0_, swimlane0_.TASKMGMTDEFINITION_ as TASKMGMT6_13_0_ from JBPM_SWIMLANE swimlane0_ where swimlane0_.ID_=?
2008-03-04 00:14:13 DEBUG (TestSetUp.java:31) - Tasks found, Swimlane: [buyer].
2008-03-04 00:14:13 DEBUG (SessionFactoryUtils.java:714) - Processing deferred close of Hibernate Sessions
分享到:
相关推荐
spring-modules-jbpm31-0.6.jar,spring整合jbpm的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插件,共两卷
Spring-Jbpm-JSF-Example.pdf
spring与jbpm的集成包(符集成方法)
jbpm-jpdl-suite-3.2GA -(5)分开压缩(共5个文件)jbpm下载 jbpm-jpdl-suite-3.2GA -(5)分开压缩(共5个文件)jbpm下载
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-----PPT 工作流JBPM完整PPT文件。帮你更快速上手。
jbpm-starters-kit-3.1.2 part1 和part2 合集完整版,希望能帮助大家,等好评哦,谢谢~
jbpm-bpmn2-5.1.0.Final.jar jbpm5
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-jpdl-suite-3.2.GA.zip
jbpm-workitems-5.1.0.Final-sources.jar jbpm5 源码
Spring与JBPM4的集成
jbpm-jpdl-suite-3.2.GA.zip
Spring与JBoss JBPM工作流集成开发指南
jbpm-jpdl-designer资源
jbpm-flow-builder-5.1.0.Final.jar jbpm5
jbpm-eclipse插件,这个插件随jbpm4.4 一起发布,位于 jbpm-4.4/install/src/gpd 目录下,由于许多人找不到这个包,所有传上来,赚点积分。