jBPM3.2.2ソース分析---org.jbpm.db*


パッケージ名から、このパッケージの類似性はデータベースに関連していることがわかります....
/* *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は2つのコンストラクション関数のみを提供します.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の方法と差が少なく、検索中はくどくない.
次に、sessionFactory、configurationのいくつかの操作を提供するHibernateHelper(Hibernateアシスタント)を見てみましょう.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ネーミングクラスです.