浏览 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命名的类,方法提供对属性,表,字段的命名... 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |