tigase自定義插件的開(kāi)發(fā)與配置
tigase插件開(kāi)發(fā)官方地址:http://www./content/plugin-development
下面是自己的翻譯加理解,英文一般,如果有誤請(qǐng)大家指出。
-----------------------------------------------------------------------------------------------------
**************************************************簡(jiǎn)介*****************************************
每個(gè)PACKETS都會(huì)經(jīng)過(guò)SM(session manager)的四個(gè)處理步驟:
1,Pre-processing
為了不影響Session Manager的性能需要限制該方法處理時(shí)間為極小值,用于判斷當(dāng)前package是否應(yīng)該被阻塞,如果返回為true,則表示阻塞。(應(yīng)該只要有一個(gè)pre-processor阻塞就算阻塞)
2,Processing
如果一個(gè)Package沒(méi)有被任何的pre-processors阻塞,則繼續(xù)執(zhí)行該方法。所有對(duì)當(dāng)前XML段感興趣的processor都會(huì)將該段加入到獨(dú)立的線(xiàn)程里運(yùn)行,這些現(xiàn)成使用內(nèi)部固定的隊(duì)列。當(dāng)所有感興趣的processor都執(zhí)行完后就可以得到通知進(jìn)入下一步。
3,post-processor
對(duì)于在第2步中沒(méi)有被任何processor處理的package將會(huì)通過(guò)所有的post-processors,并被最后一個(gè)post-processor轉(zhuǎn)發(fā)到一個(gè)目的地,大多數(shù)情況是以<message/>的形式被轉(zhuǎn)發(fā)。
4,filter
對(duì)于以上三步任何形式的結(jié)果result輸出,都會(huì)被所有的filters攔截過(guò)濾,這些結(jié)果可能最終被攔截也可能被放行。
由于session manager和processors都是消費(fèi)者,所以在所有的processors中應(yīng)該至少有一個(gè)processor新建一個(gè)package并發(fā)送給某個(gè)目標(biāo)。
***************************************************深入*****************************************
當(dāng)需要編寫(xiě)一個(gè)自己的PLUGIN的時(shí)候根據(jù)上面的步驟分別需要實(shí)現(xiàn)以下四個(gè)接口:
1,XMPPPreprocessorIfc
2,XMPPProcessorIfc
3,XMPPPostprocessorIfc
4,XMPPPacketFilterIfc
這四個(gè)接口各需要實(shí)現(xiàn)一個(gè)簡(jiǎn)單的方法,每個(gè)方法的參數(shù)類(lèi)似,參數(shù)描述如下:
-Packet packet 需要被處理的PACKET,該P(yáng)ACKET不能為NULL雖然在PROCESS處理過(guò)程中無(wú)法修改它
-XMPPResourceConnection session 用于保存所有用戶(hù)的數(shù)據(jù),它提供權(quán)限訪問(wèn)用戶(hù)的倉(cāng)庫(kù)數(shù)據(jù),在沒(méi)有在線(xiàn)用戶(hù)SESSION的情況下該參數(shù)可以為null
-NonAuthUserRepository repo 該參數(shù)往往在參數(shù)session為NULL的時(shí)候被使用,它用于為不在線(xiàn)的用戶(hù)保存私有或公開(kāi)的數(shù)據(jù)信息。
-Queue<Packet> results 這個(gè)為輸入數(shù)據(jù)包的處理結(jié)果產(chǎn)生的數(shù)據(jù)包集合,它總被要求一定要存放一個(gè)輸入數(shù)據(jù)包PACKET的備份到里面,其實(shí)包含了所有需要處理的PACKET,包括process生成的結(jié)果packet。
-Map<String, Object> settings 為PLUGIN制定配置信息,一般情況下不需要使用,然而如果需要訪問(wèn)額外的數(shù)據(jù)庫(kù)則可以通過(guò)配置文件將數(shù)據(jù)庫(kù)連接字符串傳給plugin
*****************************************************實(shí)戰(zhàn)****************************************
編寫(xiě)的時(shí)候根據(jù)自己需要來(lái)決定實(shí)現(xiàn)哪個(gè)接口,當(dāng)然也可以實(shí)現(xiàn)多個(gè)接口。
具體操作參考http://www./content/writing-plugin-code
配置plugin,假如新建的plugin的ID為myplugin,則修改運(yùn)行時(shí)加載的文件init.properties,加入如下一行
--sm-plugins=+myplugin,-oldplugin
表示裝載進(jìn)去新的myplugin,同時(shí)不去加載oldplugin
下面是自己寫(xiě)的一個(gè)自定義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 {
- //處理客戶(hù)端發(fā)送過(guò)來(lái)的packet
-
- }
-
-
- @Override
- public void processServerSessionPacket(Packet packet,
- XMPPResourceConnection session, NonAuthUserRepository repo,
- Queue<Packet> results, Map<String, Object> settings)
- throws PacketErrorTypeException {
- //處理服務(wù)器內(nèi)部的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中實(shí)現(xiàn)XMPP協(xié)議中的java:iq:search功能。
寫(xiě)完之后修改啟動(dòng)配置文件ini.properties為:
- --sm-plugins=......,+java:iq:search
其中java:iq:search與類(lèi)中的ID屬性值相同
此時(shí),當(dāng)你用PIS在客戶(hù)端想服務(wù)器端發(fā)送如下XML片段的時(shí)候:
- <iq type="get"
- id="12244603"
- to="tigase-com">
- <query xmlns="jabber:iq:search">
- </query>
- </iq>
類(lèi)中的方法processFromUserToServerPacket()將會(huì)被調(diào)用
|