`
yuanyao
  • 浏览: 147225 次
  • 性别: Icon_minigender_1
  • 来自: 就那小山沟
社区版块
存档分类
最新评论

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

    博客分类:
  • Jbpm
阅读更多

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

/*
*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命名的类,方法提供对属性,表,字段的命名...
分享到:
评论

相关推荐

    jbpm-jpdl-src.rar

    8. **org.jbpm.db**:数据库相关的实现,jBPM通常会将流程实例和相关数据持久化到数据库中。 9. **org.jbpm.context**:上下文管理,处理流程中的变量和环境信息。 10. **org.jbpm.test**:测试用例,这些可以帮助...

    Eclipse集成JBPM

    - **db**: 各种数据库的建表SQL语句。 - **lib**: 依赖的第三方库。 - **doc**: API文档及用户使用向导。 - **designer**: Eclipse插件,用于辅助开发JBPM。 - **server**: 基于JBoss的JBPM控制台及示例。 ###...

    jbpm-jpdl-3.2.2

    jbpm-jpdl-3.2.2是一个与业务流程管理(BPM)相关的软件包,专注于使用JPDL(JBoss Process Definition Language)来定义和执行业务流程。在这个压缩包中,我们找到了几个关键文件和目录,它们揭示了jbpm-jpdl-3.2.2...

    jBPM-JPDL v3.2环境部署——发布到Tomcat + MySQL

    下载jBPM-JPDL v3.2.2,解压至E:\Java\tools\jbpm-jpdl-3.2.2。解压后的目录结构包括: - `src`:jBPM源代码 - `config`:jBPM、Hibernate和log4j的配置文件 - `db`:不同数据库的建表SQL语句 - `lib`:jBPM所需依赖...

    JBPM企业流程模块开发

    3. **指定插件路径**:点击对话框右侧的`New Local Site...`按钮,选择JPDL-Designer插件所在路径`D:\jbpm-jpdl-3.2.2\designer\eclipse`。 #### MyEclipse配置数据库连接 1. **打开数据库探索视角**:在MyEclipse...

    jbpm-jdpl框架简介.pdf

    解压jBPM-jpdl-suite-3.2.3.zip后,会发现多个有用目录,如/config包含默认配置文件,/db包含针对不同数据库的初始化SQL脚本,/designer包含图形设计工具,/examples包含示例流程,/doc提供文档资料,/server包含预...

    jbpm运行环境配置

    初始化数据库通常涉及运行db目录下的SQL脚本,这些脚本创建了jbpm运行所需的表结构。确保选择与你数据库类型匹配的脚本,并正确执行。 jbpm的数据源配置基于Hibernate,这意味着你需要在hibernate.cfg.xml文件中...

    JBPM图解安装指南

    JBPM的下载分为标准包和套件包,标准包(jbpm-jpdl-3.2.2.zip)较小,包含核心程序,而套件包(jbpm-jpdl-suite-3.2.2.zip)则带有预配置的JBOSS服务器,便于快速启动。解压缩后,你可以将JBPM的Eclipse插件目录features...

    jBPM-jPDL学习笔记—框架设计简介

    jBPM,全称JBoss Business Process Management,是一款强大的开源业务流程管理框架,它涵盖了业务流程管理、工作流和服务协作等多个领域。jBPM的核心在于它的可执行流程语言,其中包括了jPDL(jBPM Process ...

Global site tag (gtag.js) - Google Analytics