简单插件开发已经讲解了简单的openfire插件怎样制作,本篇将会讲解如何实现一个简单的和客户端交互的插件。
首先我们要知道,openfire 的四种常用的插件集成方式:
(1)Component:可以接收一个特定子域(sub-domain)的所有包。比如test_componet.hoo.com。所以一个发送给jojo@test_componet.hoo.com的包将被转发给这个componet.
(2)IQHandler:相应包中特定的元素名或命名空间。下面的代码展示了如何注册一个IQHandler.
IQHandlermyHandler = new MyIQHander();
IQRouteriqRouter = XMPPServer.getInstance().getIQRouter();
iqRouter.addHandler(myHandler);
(3)PacketInterceptor:这种方式可以接收系统传输的所有包,并可以随意的丢弃它们。例如,一个interceptor可以拦截并丢弃所有含有不健康信息的消息,或者将它们报告给系统管理员。
(4)使用JiveGlobals.getProperty(String)和 JiveGlobals.setProperty(String, String)方法将我们的插件设置为openfire的一个全局属性。通过实现org.jivesoftware.util.PropertyEventListener方法可以将我们的插件做成一个属性监听器监听任何属性的变化。通过PropertyEventDispatcher.addListener(PropertyEventListener)方法可以注册监听。要注意的一点是,一定要在destroyPlugin()方法中将注册的监听注销。
本篇文章将会主要使用IQHandler来实现openfire插件,有关使用PacketInterceptor实现可以参考文章:
http://www.cnblogs.com/hoojo/archive/2013/03/29/2988437.html
(一)确定客户端和服务器端进行通讯的IQ的样式
iq类型有四种:get、set、error、result。
这里我们主要讨论get类型,其余类型的处理方式类似。
我们设计的客户端请求格式如下:
<iq id=”H40yo-4” type=”get”from=”test@yourhost/Smack”>
服务器端返回格式如下:
<iq type=”result” id=”VKe0a-4”to=”test@yourhost/Smack”>
(二)编写继承IQHandler的类,用于拦截来自客户端的IQ请求: