Spring, Springmodules, JBPM持久化集成理解系列二
【本系列如需转载,请注明作者及出处】
本系列文章假设阅者具备以下知识:
1,ThreadLocal相关知识
2,Spring持久化,事务管理相关知识
3,Hibernate 持久化相关知识
4,Jbpm 持久化相关知识
5,Springmodules项目相关知识
6,相关J2EE知识
且具备以下材料:
1,Spring源代码
2,Hibernate源代码
3,Jbpm源代码
4,Springmodules源代码
本篇尝试探讨SpringModules集成的背后逻辑,这涉及到JbpmContext持久化的哲学。
JbpmContext持久化管理的哲学是,如果用户提供Context数据库连接,那么用户就要管理该数据库的打开与关闭。如果使用JbpmContext自己产生的持久化服务,那么该服务就要管理与持久化相关的操作。很像各人自扫门前雪,哪管他人瓦上霜。
这里首先引用Jbpm User Guide里面关于持久化的描述:
7.5. User provided stuff
You can also programmatically provide JDBC connections, hibernate sessions and hibernate session factories to jBPM.
When such a resource is provided to jBPM, it will use the provided resources rather then the configured ones.
The JbpmContext class contains some convenience methods to inject resources programmatically. For example, to provide a JDBC connectio to jBPM, use the following code:
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
Connection connection = ...;
jbpmContext.setConnection(connection);
// invoke one or more persistence operations
} finally {
jbpmContext.close();
}
the JbpmContext class has following convenience methods for providing resource programmatically:
JbpmContext.setConnection(Connection);
JbpmContext.setSession(Session);
JbpmContext.setSessionFactory(SessionFactory);
上面的文字Jbpm就声明了它只管它自己的持久化逻辑,至于别人塞过来的,对不起,那是别人的事情。我想,很多人在看到Jbpm User guide的这些文字的时候,都会想弄明白藏在这些文字背后的逻辑的。 Jbpm中所有数据库操作的入口都是JbpmContext,各种的数据库操作例如save,JbpmContext都会委派给不同的xxxSession,例如GraphSession,TaskMgmtSession等来处理。
假设这个操作是loadTaskInstance,我将整个过程就缩小到我们关心的领域,一个是连接的打开,另外一个是连接的关闭:
第一部分,Session的打开:
【位置JbpmContext】
public TaskInstance loadTaskInstance(long taskInstanceId) {
return getTaskMgmtSession().loadTaskInstance(taskInstanceId);
}
public TaskMgmtSession getTaskMgmtSession() {
PersistenceService persistenceService = getPersistenceService();
if (persistenceService==null) return null;
return (persistenceService!=null ? persistenceService.getTaskMgmtSession() : null);
这个PersistenceService就是jbpm.cfg.xml里面配置的org.jbpm.persistence.db.DbPersistenceService了,在上面getTaskMgmtSession这个方面里面PersistenceService就返回了一个带有一个Hibernate session的TaskMgmtSession了。
如下所示:
【位置DbPersistenceService】
public TaskMgmtSession getTaskMgmtSession() {
if (taskMgmtSession==null) {
Session session = getSession();
if (session!=null) {
taskMgmtSession = new TaskMgmtSession(session);
}
}
return taskMgmtSession;
}
好了,到此我们就差不多达到Jbpm管理Session的环节了,我们再进入到getSession方法,看看它到底做了什么事情:
准备工作:1)以下是会涉及的布尔变量,以及其默认值:
【位置DbPersistenceService】
Connection connection = null;
boolean mustConnectionBeClosed = false;
Transaction transaction = null;
boolean isTransactionEnabled = true;
boolean isCurrentSessionEnabled = false;
boolean isRollbackOnly = false;
Session session;
boolean mustSessionBeFlushed = false;
boolean mustSessionBeClosed = false;
准备工作2)由于DbPersistenceService只有一个Constructor,也就是
【位置DbPersistenceService】
public DbPersistenceService(DbPersistenceServiceFactory persistenceServiceFactory) {
this.persistenceServiceFactory = persistenceServiceFactory;
this.isTransactionEnabled = persistenceServiceFactory.isTransactionEnabled();
this.isCurrentSessionEnabled = persistenceServiceFactory.isCurrentSessionEnabled();
}
在这里我们就知道了,进行数据库操作所用到Session,SessionFactory就只能通过相关的Setter和Getter方法来取到了。 现在进入这个方法:
【位置DbPersistenceService】
public Session getSession() {
if ( (session==null)
&& (getSessionFactory()!=null)
) {
Connection connection = getConnection(false);
if (isCurrentSessionEnabled) {
session = getSessionFactory().getCurrentSession();
mustSessionBeClosed = false;
mustSessionBeFlushed = false;
mustConnectionBeClosed = false;
} else if (connection!=null) {
log.debug("creating hibernate session with connection "+connection);
session = getSessionFactory().openSession(connection);
mustSessionBeClosed = true;
mustSessionBeFlushed = true;
mustConnectionBeClosed = false;
} else {
log.debug("creating hibernate session");
session = getSessionFactory().openSession();
mustSessionBeClosed = true;
mustSessionBeFlushed = true;
mustConnectionBeClosed = false;
}
if (isTransactionEnabled) {
log.debug("beginning hibernate transaction");
transaction = session.beginTransaction();
}
}
return session;
}
因为注入到JbpmContext的session和sessionFactory Setter方法都是将其注入到persistenceService里面的 在上面这个方法里 1)如果用户向JbpmContext提供了Session,那么会立刻返回该session,并且不会修改mustConnectionBeClosed,mustSessionBeClosed等的值。
2)如果用户向JbpmContext提供了SessionFactory,在getConnection时将mustConnectionBeClosed设置成了false,另外使用返回的Connection创建了一个Hibernate Session,即session = getSessionFactory().openSession(connection);紧接着将mustSessionBeClosed和mustSessionBeFlushed设置成了true。
分享到:
相关推荐
jbpm-starters-kit-3.1.2.part1 和 jbpm-starters-kit-3.1.2.part2 是两个分卷压缩文件,它们共同组成一个完整的jbpm开发入门套件。jbpm(Java Business Process Management)是一个开源的工作流管理系统,用于实现...
2. **持久化机制**:jbpm使用Hibernate作为默认的持久化机制,确保流程实例和相关数据在数据库中的存储和检索。 3. **规则引擎**:jbpm集成Drools作为规则引擎,允许在流程中嵌入业务规则,根据规则触发流程的分支...
3. **持久化**:jbpm使用JPA(Java Persistence API)进行数据持久化,可以将流程实例、任务和变量等信息存储在数据库中,便于后续查询和管理。 4. **集成能力**:jbpm可与Java EE、Spring等框架无缝集成,也可以与...
5. **持久化机制**:jbpm-4.4使用Hibernate作为默认的持久化框架,确保流程实例和任务状态能够在数据库中安全存储和恢复。 6. **任务管理**:jbpm支持任务分配和管理工作,包括任务的创建、分配、领取、完成以及...
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
前端分析-2023071100789
基于kinect的3D人体建模C++完整代码.cpp
搞机工具箱10.1.0.7z
GRU+informer时间序列预测(Python完整源码和数据),python代码,pytorch架构,适合各种时间序列直接预测。 适合小白,注释清楚,都能看懂。功能如下: 代码基于数据集划分为训练集测试集。 1.多变量输入,单变量输出/可改多输出 2.多时间步预测,单时间步预测 3.评价指标:R方 RMSE MAE MAPE,对比图 4.数据从excel/csv文件中读取,直接替换即可。 5.结果保存到文本中,可以后续处理。 代码带数据,注释清晰,直接一键运行即可,适合新手小白。
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
基于ANSYS LSDyna的DEM-SPH-FEM耦合模拟滑坡入水动态行为研究,基于ANSYS LSDyna的DEM-SPH-FEM耦合的滑坡入水模拟分析研究,基于ansys lsdyna的滑坡入水模拟dem-sph-fem耦合 ,基于ANSYS LSDyna; 滑坡入水模拟; DEM-SPH-FEM 耦合,基于DEM-SPH-FEM耦合的ANSYS LSDyna滑坡入水模拟
auto_gptq-0.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
复件 复件 建设工程可行性研究合同[示范文本].doc
13考试真题最近的t64.txt
好用我已经解决报错问题
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!
auto_gptq-0.4.2-cp38-cp38-win_amd64.whl
自动立体库设计方案.pptx
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!