• (转)OpenFire源码学习之十四:插件管理


    转:http://blog.csdn.net/huwenfeng_2011/article/details/43418433

    Plugin管理

    Openfire把插件模块加入到容器分为以下步骤:

    l 通过classloader加载lib目录下载的所有jar

    l 通过classloader加载dir目录下的所有文件

    l 定位和加载module.xml到context

    l 遍历jive模块实体,负荷给定的类作为一个模块,然后启动它

    Openfire插件加载流程图:

    Openfire的插件管理类PluginManager。加载插件的方法是loadPlugin(File pluginDir)这里的参数pluginDir是插件的目录。openfire会读取插件目录里面的pugin.xml文件关于这个文件的详细内容在Plugin接口介绍了。根据该插件的在minServerVersion标识字段与本openfire系统版本是否符合。如果符合则进行下一步,反之return了。Openfire会继续往下侦查插件,查看该插件是否是是另个插件的孩子插件。如果是则PluginLoader会加载该插件的父插件。最后一步一步的加载完整个插件。在上面流程图中有个PluginDevEnvironment类,该类是OpenFire的插件框架的数据模型代码,也就是Jive象征着J2EE的规范一样。

    Openfire提供了加载插件,对应了也提供了卸载插件的方法unloadPlugin()。unloadPlugin方法会根据目录的名称找对应的插件将器删除,但不是把插件的jar文件删掉。留着jar文件的目的就是为了该插件可重新启动。

    在PluginManager类中还有个内部类PluginMonitor。这个类实现了Runnable接口,无疑它是个线程类。它是个监控插件目录的服务类,它会定期检查新插件的jar文件和提取他们然后加载新的插件目录。

    Plugin加载器

    Openfier的插件加载器——PluginClassLoader它会搜索插件目录类和jar文件,然后构建类加载器来加载里面的资源。加载资源如下:

    l 任何在lib下的jar文件会被添加到classpath中

    l 任何在类目录下的的文件也被添加在classpath中

    PluginClassLoader继承了URLClassLoader,此加载器是通过url搜索jar文件和目录加载类和资源。

    addDirectory方法

    该方法会装载插件目录,他会依次加载以下几个目录

    Classes->database->i18n->web->lib

    addURLFile方法

    添加给定的URL为这个类装入器的类路径,缓存JAR文件连接,因此它可以卸载后

    缓存配置

    一、缓存配置

    缓存配置信息PluginCacheConfigurator

    ......

    二、登记缓存

    插件的缓存配置信息在PluginCacheRegistry类中:

    [java] view plain copy
     
    1. public void registerCache(String pluginName, CacheInfo info) {  
    2.         extraCacheMappings.put(info.getCacheName(), info);  
    3.         List<CacheInfo> caches = pluginCaches.get(pluginName);  
    4.   
    5.         if (caches == null) {  
    6.             caches = new ArrayList<CacheInfo>();  
    7.             pluginCaches.put(pluginName, caches);  
    8.         }  
    9.   
    10.         caches.add(info);  
    11.   
    12.         // Set system properties for this cache  
    13.         CacheFactory.setCacheTypeProperty(info.getCacheName(), info.getType().getName());  
    14.         CacheFactory.setMaxSizeProperty(info.getCacheName(), getMaxSizeFromProperty(info));  
    15.         CacheFactory.setMaxLifetimeProperty(info.getCacheName(), getMaxLifetimeFromProperty(info));  
    16.         CacheFactory.setMinCacheSize(info.getCacheName(), getMinSizeFromProperty(info));  
    17.     }  
  • 相关阅读:
    笔记本越用越慢的解决方法。
    ubuntu 16.04 的IP地址变更
    如何把路由器当作交换机来使用
    通过 rufus 创建启动U盘,安装 VMWare Esxi
    Enable SMB2 on the Client
    Shiro入门学习与实战(一)
    Linux下Nginx1.9.9的安装
    Activiti工作流学习之SpringBoot整合Activiti5.22.0实现在线设计器(二)
    Activiti工作流学习之概述(一)
    Sqoop的安装及常用命令
  • 原文地址:https://www.cnblogs.com/wangle1001986/p/7228086.html
Copyright © 2020-2023  润新知