从包名上就可以看出这个包的类似乎与数据库有关....
/*
*jBPM3.2.2
*/
类列表:
-ContextSession.java
-GraphSession.java
-Hibernate.queries.hbm.xml
-JbpmSchema.java
-JbpmSession.java
-JbpmSessionFactory.java
-JobSession.java
-LoggingSession.java
-TaskMgmtSession.java
--hibernate包下
---AccessType.java
---ConverterEnumType.java
---Converters.java
---HibernateHelper.java
---jbpm.converter.properties
---JbpmNamingStrategy.java
---StringMax.java
--compatibility
---JbpmSchemaUpdate.java
先来看看那一堆Session类都是些什么东西
从名字上看,JbpmSessioFactory是一个session工厂,里面提供了一些与session相关的方法,玩过Hibernate的对这个类应该比较清楚(Hibernate的sessionFactory),这里就不多说了,来看看getInstance()这个方法。
getInstance()是一个静态方法,返回一个JbpmSessionFactory实例,代码如下:
public static JbpmSessionFactory getInstance() {
if (instance==null) {
//假如Jndi名不为空
if (jndiName!=null) {
try {
// fetch the JbpmSessionFactory from JNDI
log.debug("fetching JbpmSessionFactory from '"+jndiName+"'");
//实例化一个执行命名操作的初始化上下文
InitialContext initialContext = new InitialContext();
//从上下文中检索名字为jndiName的对象
Object o = initialContext.lookup(jndiName);
//检查o是否可以强制转换为JbpmSessionFactory对象
instance = (JbpmSessionFactory) PortableRemoteObject.narrow(o, JbpmSessionFactory.class);
} catch (Exception e) {
throw new JbpmException("couldn't fetch JbpmSessionFactory from jndi '"+jndiName+"'");
}
} else { // else there is no JNDI name configured
// create a new default instance.
log.debug("building singleton JbpmSessionFactory");
//假如jndi名为空,建立session工厂
instance = buildJbpmSessionFactory();
}
}
//返回session工厂实例
return instance;
}
JbpmSession就是对Hibernate的Session的封装,GraphSession这个是我们最长用到的session,流程定义的部署、查找流程定义、装载流程实例等等,特别的有用,那好,仔细的分析一下:
先来看看部署流程定义找个方法:
public void deployProcessDefinition(ProcessDefinition processDefinition) {
//获取流程定义的名字
String processDefinitionName = processDefinition.getName();
//流程定义有名字
if (processDefinitionName!=null) {
//根据流程定义的名字来查找最后的流程定义
ProcessDefinition previousLatestVersion = findLatestProcessDefinition(processDefinitionName);
// 假如有最后的流程定义
if (previousLatestVersion!=null) {
//设置下一个流程定义版本号
processDefinition.setVersion( previousLatestVersion.getVersion()+1 );
} else {
//假如没有流程定义,那么设置流程定义的版本号为1
processDefinition.setVersion(1);
}
//保存流程定义到Jbpm数据库
session.save(processDefinition);
} else {
throw new JbpmException("process definition does not have a name");
}
}
在来看看findLatestProcessDefinition()这个方法:
public ProcessDefinition findLatestProcessDefinition(String name) {
ProcessDefinition processDefinition = null;
try {
//从hibernate.queries.hbm.xml中获取查询语句(hibernate.queries.hbm.xml封装了session的hql语句)
Query query = session.getNamedQuery("GraphSession.findLatestProcessDefinitionQuery");
query.setString("name", name);
query.setMaxResults(1);
processDefinition = (ProcessDefinition) query.uniqueResult();
} catch (Exception e) {
System.out.flush();
System.err.flush();
try {
Thread.sleep(200);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
e.printStackTrace(); log.error(e);
System.out.flush();
System.err.flush();
jbpmSession.handleException();
throw new JbpmException("couldn't find process definition '" + name + "'", e);
}
return processDefinition;
}
其他的方法就不在多说,大同小异。
ContextSession只提供了两个构造函数。LoggingSession负责保存、加载、查询日志,来看一段代码,loadProcesslog()方法:
public ProcessLog loadProcessLog(long processLogId) {
ProcessLog processLog = null;
try {
//加载流程日志ID为processLogId的流程日志
processLog = (ProcessLog) session.load(ProcessLog.class, new Long(processLogId));
} catch (Exception e) {
log.error(e);
jbpmSession.handleException();
throw new JbpmException("couldn't load process log '"+processLogId+"'", e);
}
return processLog;
TaskMgmtSession是一个查找、装载任务实例的session,对查找、装载任务实例提供了各种方法,方法与其他session的方法差不多,找里就不啰嗦了.
下面来看看HibernateHelper(Hibernate协助者),该类里提供了对sessionFactory、configuration的一些操作,看一下clearHibernateCache()方法的代码:
public static void clearHibernateCache(SessionFactory sessionFactory) {
//清除所有在查询缓冲区的查询结果
sessionFactory.evictQueries();
//获取从实体名到元数据对象的所有类元数据封装在一个Map里
Map classMetadata = sessionFactory.getAllClassMetadata();
Iterator iter = classMetadata.keySet().iterator();
while (iter.hasNext()) {
String entityName = (String) iter.next();
log.debug("evicting entities "+entityName);
//根据实体名字加载CLASS
Class entityClass = ClassLoaderUtil.loadClass(entityName);
//清除所有二级缓存的条目
sessionFactory.evict(entityClass);
}
//获取从collection名到元数据对象的所有连接元数据封装在以个Map里
Map collectionMetadata = sessionFactory.getAllCollectionMetadata();
iter = collectionMetadata.keySet().iterator();
while (iter.hasNext()) {
String collectionName = (String) iter.next();
log.debug("evicting collection "+collectionName);
//清除所有二级缓存的条目
sessionFactory.evictCollection(collectionName);
}
}
JbpmNamingStrategy(jbpm命名策略类)是一个Jbpm命名的类,方法提供对属性,表,字段的命名...
分享到:
相关推荐
8. **org.jbpm.db**:数据库相关的实现,jBPM通常会将流程实例和相关数据持久化到数据库中。 9. **org.jbpm.context**:上下文管理,处理流程中的变量和环境信息。 10. **org.jbpm.test**:测试用例,这些可以帮助...
jbpm-jpdl-3.2.2是一个与业务流程管理(BPM)相关的软件包,专注于使用JPDL(JBoss Process Definition Language)来定义和执行业务流程。在这个压缩包中,我们找到了几个关键文件和目录,它们揭示了jbpm-jpdl-3.2.2...
下载jBPM-JPDL v3.2.2,解压至E:\Java\tools\jbpm-jpdl-3.2.2。解压后的目录结构包括: - `src`:jBPM源代码 - `config`:jBPM、Hibernate和log4j的配置文件 - `db`:不同数据库的建表SQL语句 - `lib`:jBPM所需依赖...
3. **指定插件路径**:点击对话框右侧的`New Local Site...`按钮,选择JPDL-Designer插件所在路径`D:\jbpm-jpdl-3.2.2\designer\eclipse`。 #### MyEclipse配置数据库连接 1. **打开数据库探索视角**:在MyEclipse...
解压jBPM-jpdl-suite-3.2.3.zip后,会发现多个有用目录,如/config包含默认配置文件,/db包含针对不同数据库的初始化SQL脚本,/designer包含图形设计工具,/examples包含示例流程,/doc提供文档资料,/server包含预...
初始化数据库通常涉及运行db目录下的SQL脚本,这些脚本创建了jbpm运行所需的表结构。确保选择与你数据库类型匹配的脚本,并正确执行。 jbpm的数据源配置基于Hibernate,这意味着你需要在hibernate.cfg.xml文件中...
JBPM的下载分为标准包和套件包,标准包(jbpm-jpdl-3.2.2.zip)较小,包含核心程序,而套件包(jbpm-jpdl-suite-3.2.2.zip)则带有预配置的JBOSS服务器,便于快速启动。解压缩后,你可以将JBPM的Eclipse插件目录features...
jBPM,全称JBoss Business Process Management,是一款强大的开源业务流程管理框架,它涵盖了业务流程管理、工作流和服务协作等多个领域。jBPM的核心在于它的可执行流程语言,其中包括了jPDL(jBPM Process ...