`

openfire学习总结之插件

阅读更多

 

一、 类加载器

 

    要深入理解openfire插件机制的内部原理,必须要深入了解一下java的类加载器。类加载器作用是加载 Java 类到 Java 虚拟机中。
    加载过程如下:Java 源程序编译后转换成 Java 字节码(.class),类加载器负责读取 字节码,并转换成java.lang.Class类的一个实例。

 

   系统提供的类加载器有:

 

    1、引导类加载器(bootstrap class loader)

      jvm内置的加载器,是用C++实现的。
      引导类加载器的加载路径,由系统属性sun.boot.class.path来指定,它的默认值指向jre的classes目录,及lib目录下rt.jar等几个jar文件。
      可通过-Dsun.boot.class.path来手工指定,也可通过-Xbootclasspath等属性来指定。

 

    2、扩展类加载器(extensions class loader)

      类加载路径由java.ext.dirs来确定,java.ext.dirs属性值指向一个或多个目录,默认jre/lib/ext,加载 Java 的扩展库$java_home/jre/ext/*.jar。

 

    3、应用类加载器(application class loader)
              主要负责加载java –classpath、-Djava.class.path或$CLASSPATH环境变量所指的目录下的类与jar包。 一般来说,Java 应用的类及其依赖jar包也都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader()来获取它。

 

   Openfire中自定义的类加载器:

 

    1、JiveClassLoader:类加载路径为openfireHome/lib下的所有jar,zip文件,加载openfire所依赖的核心类库。

 

    2、PluginClassLoader:openfire插件加载的时候,会为每个插件创建一个PluginClassLoader对象,它加载路径为插件目录下的classes,database,i18n,web目录,与lib目录下所有的jar,zip文件,但排除plugin-pluginName.jar文件

 

二、 内部原理

 

        1、openfire插件类似于web容器下的多个独立的web应用,openfire就是容器,负责管理插件的生命周期。

 

  2、openfire通过定时的扫描openfire/plugins目录下的.jar、.war文件及同名的目录,跟踪他们的变化,来决定加载还是卸载一个插件。这跟tomcat很类似,主要的差异在与openfire的PluginClassLoader没有tomcat的WebAppClassLoader那样的优先覆盖机制,openfire严格的遵循了java.lang.ClassLoader类的委托机制。

 

  3、由于ClassLoader的委托模型,由JiveClassLoader加载的核心类,无法通过委托PluginClassLoader来隐式加载到插件类,即openfire/lib下的核心类不能依赖于插件中的类,而插件类却可以通过委托JiveClassLoader来加载核心类,插件类可以使用核心类,这个开发中需要注意,避免产生依赖错乱。

 

三、 生命周期

 

    1、加载


    加载一个插件时,先解压.jar/.war文件,读取插件目录下的plugin.xml,得到Plugin接口的一个实现类XXXPlugin,通过创建一个新的PluginLoader对象来加载XXXPlugin,调用默认的无参数构造函数创建一个XXXPlugin对象

 

    2、初始化


      通过执行initializePlugin,让插件初始化

 

    3、使用


      初始化后插件即开始工作,处理商业逻辑

 

    4、销毁


      卸载一个插件时,首先调用这个XXXPlugin对象的destroyPlugin方法,并从PluginManager中删除这个XXXPlugin对象,然后通过去除PluginClassLoader的引用,让插件中的所有类等待垃圾回收,并删除这个插件目录。destroyPlugin方法,应该终止它所开启的线程,应该删除所有由上层类加载器对PluginClassLoader加载的类实例的引用,保证插件的被垃圾回收

 

0
0
分享到:
评论

相关推荐

    OpenFire插件开发从入门到精通

    OpenFire是一款基于Java开发的实时通信(XMPP)服务器,广泛应用于企业级的即时通讯解决方案。...在这个过程中,持续学习和不断探索是提升技能的关键,希望本文能为你的OpenFire插件开发之旅提供有力的指导。

    原创openfire插件(发送在线消息、离线消息)

    目前研究插件的还比较少,简单做一下学习总结。详细介绍请看我的blog:http://hi.baidu.com/jyleon/blog/item/5a6627dd7fc4dbd18d1029bf.html

    openfire配置到eclipse

    ### Openfire配置到Eclipse详解 #### 一、前言 在进行即时通讯系统的开发时,经常需要用到开源的即时通讯服务器——Openfire。...通过学习官方文档和实践操作,相信您可以更好地掌握Openfire的配置与使用方法。

    openfire_src_3_8_0.tar.gz

    总结,Openfire作为一个强大且灵活的即时通讯服务器,其源码的分析和应用对于开发者来说是宝贵的资源。通过学习和研究,不仅可以提升对XMPP协议的理解,还能掌握Java服务器开发技术,为构建自己的IM系统打下坚实基础...

    openfire Java客户端开发文档详解

    总结,Openfire Java客户端开发涵盖了XMPP协议的理解、JStrophe库的使用以及Openfire特定API的调用。通过深入学习和实践,开发者可以构建出功能丰富的即时通讯应用,满足各种业务需求。`javadoc`文件则为开发者提供...

    spark+openfire二次开发(三)

    同时,对于Openfire,我们可能需要定制插件来满足特定的通讯需求,如添加新的消息类型、实现特定的认证机制等。 在实际操作中,"example"这个文件很可能是包含了一些示例代码或者配置,用于展示如何在Spark上处理...

    android 即时通信聊天工具源码

    4. 扩展性:Openfire支持插件扩展,可以根据需求添加自定义功能,如文件传输、视频通话等。 5. 安全性:Openfire支持SSL/TLS加密,保证通信安全。客户端也需要配置相应的安全措施,如HTTPS连接和数据加密。 三、...

    利用jwchat搭建WebIM

    总结,搭建基于openfire和jwchat的WebIM系统,需要熟悉服务器管理和前端开发。通过这个过程,不仅可以实现即时通讯功能,还能深入理解XMPP协议和Web应用的运行机制。对于开发者来说,这是一个学习网络通信和Web应用...

    Android聊天项目D3Xmpp.zip

    D3Xmpp 是一个完整的 XMPP 的 Android 的项目服务端使用 openfire 3.9.3客户端使用 ...PS:该项目是本人在学习xmpp过程中总结的一些东西,代码组织凌乱,旨在帮助新入门xmpp学习xmpp的基本使用 标签:D3Xmpp

    2021-2022年收藏的精品资料企业即时通信客户端的开发.doc

    在本文的研究中,开发者深入学习了Openfire服务器和Smack API的实现,Openfire是一个开源的XMPP服务器,而Smack则是一个用于Java和Android平台的XMPP客户端库。通过这两者的结合,可以构建一个支持即时消息、语音、...

    javascript XMPP strophe.JS,聊天室

    JavaScript XMPP 与 Strophe.js:构建Web即时通讯聊天室 在现代Web应用中,实时通信功能变...在实际开发过程中,不断学习和实践,理解XMPP协议和Strophe.js的工作原理,将有助于你构建更稳定、高效的Web即时通讯应用。

Global site tag (gtag.js) - Google Analytics