jBPM3.2.2源码分析---org.jbpm.db*

从包名上就可以看出这个包的类似乎与数据库有关....

[color=red]/*
*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
[/color]

先来看看那一堆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命名的类,方法提供对属性,表,字段的命名...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值