1、openfire的Plugin插件接口介绍
2、openfire插件目录结构及含义
要在一个成熟的即时通讯服务器中去扩展一个新的功能其实并不是一件容易的事情。为什么不容易呢?我们仔细想一想, 即时通讯服务器为了支持上百万级的在线用户,往往需要几十甚至上百台服务器,动态扩展几十上百台服务器的功能是复杂的。
但是,自从电脑台式机有了标准接口,可以随意选择自己喜欢的硬件进行组装后,大型软件的开发似乎也借鉴了其思想,变得简单容易了很多。openfire的插件设计,有点像台式机,可以动态的插入扩展设备。例如显卡,每个厂商的显卡功能不一样,但是接口一样。openfire也定义了类似台式机一样的接口,我们呆会将告诉大家。
Openfire为了扩展其功能,适用于不同的业务环境,精心设计了插件的机制,本节,我们就来详细的剖析一下,这种机制。
编写openfire的插件必须派生一个插件接口Plugin。只要一个类派生了这个接口,那么会被openfire认为是一个插件, 这就是刚才我们讲的台式机扩展插槽。plugin的源码如下所示:
public interface Plugin { public void initializePlugin(PluginManager manager, File pluginDirectory); public void destroyPlugin(); }
Plugin有2个接口,分别是初始化插件的时候和销毁插件的时候调用的,下面对这两个接口进行介绍:
initializePlugin表示初始化插件,无论写什么插件,你总有些事情要初始化吧,例如:
如果你用到了数据库,那么你就在这个函数中初始化数据库连接;
如果你有一个数据结构要占用一1M的内存,那么你就在这里初始化内存吧;
如果你使用了redis,那么就应该在这里初始化reids的连接;
如果你想初始化日志系统,那么你就在这里初始化日志系统吧。
哈哈,突然写了这么漂亮一个排比句,你记住了initializePlugin需要做什么了吗?
destroyPlugin表示对插件进行销毁。例如,你创建了一个线程池来做一些坏事,那么请在这里回收线程池吧,不然,openfire的整个系统很可能被你的只开不关的行为给整慢,甚至崩溃(不知道您理解这句话没?)。
另外,如果,你使用了大量的内存,那么也建议你在此处将内存释放掉吧。因为,对于IM服务器来说,内存确实非常重要。
明白了destroyPlugin应该做什么事情了吧,不明白,没关系,加我们的群,或者告诉老师吧。我们将提供一对一的老师辅导,让你节省时间,和女朋友出去旅游吧,记住,开房的时候,您一定还要问你的女朋友:“我们是开一个双人间还是两个单人间呢?”,千万别说,开一个单一人,那也太明显了吧。
如果你女朋友回答,我们节约一点把,就开一个双人间,那你已经成功了一半。如果她说,开2个单人间,也不要灰心。晚上过去找她,说回忆一下今天的旅程。然后说给她看看手相,我想你也应该成功了一半了。
好了,大家别误会,我们教的是openfire,开火的意思,你明白的。希望本段话没有女孩子阅读。
initializePlugin如下三种情况下,会被调用:
1、openfire启动的时候;
2、用户上传插件的时候;
3、重启插件的时候;
上传插件和重启插件如下图所示:
destroyPlugin在删除插件的时候,会被调用,如下图点击叉号就会被调用:
最后,要说的是,理解插件什么时候被调用,暂时没有什么卵用,但是积少成多,江流也能汇集成大海,你说是不是呢?
Openfire的插件放在openfire_src\src\plugins下,每一个插件占一个目录。下图是openfire源码中的插件例子。
我们随便打开一个插件目录介绍一下,例如打开broadcast,如下图所示:
下面对上面的各个目录进行简要介绍:
(1)src:src是源代码目录,不用怀疑,你的插件的所有源代码都放在这里。
(2)changelog.html: 是发布日志,记录插件各个版本的变化情况。点击下图的按钮,可以看到这个html页面:
注意如果一个插件没有提供changelog.html页面,那么就不会有这个按钮,插件也并不会报错。这个文件仅仅是给人读的,不是给机器读的。
(3)logo_large.gif和logo_small.gif表示的是插件的logo,也支持png格式的文件,大小分别是32*32和16*16。,如下图,logo被显示在左边:
(4)plugin.xml:是最重要的插件的配置文件。这个文件非常重要,openfire需要读取插件信息,例如插件的启动类是哪一个,需要在plugin.xml中定义。内容如下,注意下面的<!-- -->的是注释:
<?xml version="1.0" encoding="UTF-8"?> <plugin> <!—插件的启动类,也可以理解为插件的main函数-- > <class>org.jivesoftware.openfire.plugin.BroadcastPlugin</class> <!—插件的名字,显示在上图的插件中-- > <name>Broadcast</name> <!—显示在上图的描述字段中 <description>Broadcasts messages to users.</description> <!—显示在上图的作者-- > <author>Jive Software</author> <!—显示在上图中的插件版本 <version>1.9.0</version> <!—插件书写的日期,这个自己知道就可以了 <date>9/13/2013</date> <!—插件的官网 <url>http://www.igniterealtime.org</url> <!—openfire的最小版本,也就是这个插件需要至少运行在版本为3.9.0的openfire上 <minServerVersion>3.9.0</minServerVersion> </plugin>
Ok,这里是插件的一些介绍,关于一个简单插件的编写,细节比较多,我们下一节课再见。您的支持是对我们劳动最好的赞扬,欢迎在页面底部留言、提问。