tigase插件开发官方地址:http://www.tigase.org/content/plugin-development
下面是自己的翻译加理解,英文一般,如果有误请大家指出。
-----------------------------------------------------------------------------------------------------
**************************************************简介*****************************************
每个PACKETS都会经过SM(session manager)的四个处理步骤:
1,Pre-processing
为了不影响Session Manager的性能需要限制该方法处理时间为极小值,用于判断当前package是否应该被阻塞,如果返回为true,则表示阻塞。(应该只要有一个pre-processor阻塞就算阻塞)
2,Processing
如果一个Package没有被任何的pre-processors阻塞,则继续执行该方法。所有对当前XML段感兴趣的processor都会将该段加入到独立的线程里运行,这些现成使用内部固定的队列。当所有感兴趣的processor都执行完后就可以得到通知进入下一步。
3,post-processor
对于在第2步中没有被任何processor处理的package将会通过所有的post-processors,并被最后一个post-processor转发到一个目的地,大多数情况是以<message/>的形式被转发。
4,filter
对于以上三步任何形式的结果result输出,都会被所有的filters拦截过滤,这些结果可能最终被拦截也可能被放行。
由于session manager和processors都是消费者,所以在所有的processors中应该至少有一个processor新建一个package并发送给某个目标。
***************************************************深入*****************************************
当需要编写一个自己的PLUGIN的时候根据上面的步骤分别需要实现以下四个接口:
1,XMPPPreprocessorIfc
2,XMPPProcessorIfc
3,XMPPPostprocessorIfc
4,XMPPPacketFilterIfc
这四个接口各需要实现一个简单的方法,每个方法的参数类似,参数描述如下:
-Packet packet 需要被处理的PACKET,该PACKET不能为NULL虽然在PROCESS处理过程中无法修改它
-XMPPResourceConnection session 用于保存所有用户的数据,它提供权限访问用户的仓库数据,在没有在线用户SESSION的情况下该参数可以为null
-NonAuthUserRepository repo 该参数往往在参数session为NULL的时候被使用,它用于为不在线的用户保存私有或公开的数据信息。
-Queue<Packet> results 这个为输入数据包的处理结果产生的数据包集合,它总被要求一定要存放一个输入数据包PACKET的备份到里面,其实包含了所有需要处理的PACKET,包括process生成的结果packet。
-Map<String, Object> settings 为PLUGIN制定配置信息,一般情况下不需要使用,然而如果需要访问额外的数据库则可以通过配置文件将数据库连接字符串传给plugin
*****************************************************实战****************************************
编写的时候根据自己需要来决定实现哪个接口,当然也可以实现多个接口。
具体操作参考http://www.tigase.org/content/writing-plugin-code
配置plugin,假如新建的plugin的ID为myplugin,则修改运行时加载的文件init.properties,加入如下一行
--sm-plugins=+myplugin,-oldplugin
表示装载进去新的myplugin,同时不去加载oldplugin
下面是自己写的一个自定义PLUGIN:
/** */ public class SearchProcessImpl extends XMPPProcessorAbstract implements XMPPProcessorIfc{ /** Class loggeer */ private static final Logger log = Logger.getLogger(SearchProcessImpl.class.getName()); private static final SimpleParser parser = SingletonFactory.getParserInstance(); private static final String[] searchConditions = new String[]{"userId", "email"}; private static final String XMLNS = "jabber:iq:search"; private static final String[] ELEMENTS = { "query" }; /** Define the plugin ID **/ private static final String ID = XMLNS; @Override public void processFromUserToServerPacket(JID connectionId, Packet packet, XMPPResourceConnection session, NonAuthUserRepository repo, Queue<Packet> results, Map<String, Object> settings) throws PacketErrorTypeException { //处理客户端发送过来的packet } @Override public void processServerSessionPacket(Packet packet, XMPPResourceConnection session, NonAuthUserRepository repo, Queue<Packet> results, Map<String, Object> settings) throws PacketErrorTypeException { //处理服务器内部的packet } @Override public String id() { return ID; } @Override public String[] supElements() { return ELEMENTS; } /** * Method description * * * @return */ @Override public String[] supNamespaces() { return new String[]{XMLNS}; } }
该方法用于在tigase中实现XMPP协议中的java:iq:search功能。
写完之后修改启动配置文件ini.properties为:
--sm-plugins=......,+java:iq:search
其中java:iq:search与类中的ID属性值相同
此时,当你用PIS在客户端想服务器端发送如下XML片段的时候:
<iq type="get" id="12244603" to="tigase-com"> <query xmlns="jabber:iq:search"> </query> </iq>
类中的方法processFromUserToServerPacket()将会被调用。