论坛首页 Java企业应用论坛

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

浏览 2221 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-03-21  

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

/*
*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命名的类,方法提供对属性,表,字段的命名...
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics