一、 类加载器
要深入理解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加载的类实例的引用,保证插件的被垃圾回收
相关推荐
代码很简单,可以用,修改一下配置文件就行了
openfire防止消息丢失插件,防止丢包插件
NULL 博文链接:https://bsr1983.iteye.com/blog/2240070
openfire群聊持久化插件,直接放到plugin目录下可用,解决群聊房间推出后房间销毁问题 附带的两张数据库表用来保存群聊离线消息
openfire 历史纪录插件,可以存放聊天记录,内含sql文件,自己写的亲测,后期继续完善
openfire 聊天记录插件,已经经过测试,欢迎下载。
openfire shell插件
openfire插件,本插件直接在openfire里安装即可,集成消息在线和离线的存储、查询接口,图片、表情、语音文件的上传和下载对外接口,因此,不需要修改openfire源码即可满足聊天的实用功能,对外提供3个接口,一消息...
openfire集群搭建所需插件
目的:主要是为了监控Openfire各类message,然后对message body做进一步...局限:因为时间有限,本插件并没有对Openfire message协议进行扩展,都是基于原生的xml协议,因此后续开发还需要进行更加深入的二次开发操作。
对Openfire进行扩展,支持在线指定聊天室和全部在线人员的查看。
openFire 保存聊天记录插件 亲测100%有效 插件直接拷贝到OpenFire安装目录的plugin下 自动安装后 进入OpenFire管理后台 服务器==》档案文件==》存档设置 几个单选框都勾选, 聊天记录保存在 ofMessageArchive 表...
博文链接:https://magicgod.iteye.com/blog/189537
XMPP 协议讲解 openfire 结构分析以及插件开发指南 希望能帮到想学习openfire的同学
一开始找国外的聊天记录插件,都不好用,没办法,自己写了一个,方便大家调用,不敢独享。具体代码我会贴到我的博客里面
两个保存聊天记录的openfire的插件 亲测可以用
自己从openfire官网上下的openfire插件。
只需在客户端asmack设置回执,在openfire数据库ofoffline中添加字段lifeid(varchar类型),即可使用,有插件,有源码,保证不丢包,不重包。
这是一个文档,内容是如何编写Openfire开发插件、部署源码