电竞比分网-中国电竞赛事及体育赛事平台

分享

tigase自定義插件的開(kāi)發(fā)與配備

 WindySky 2016-04-10
      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:

  1. /** 
  2.  */  
  3. public class SearchProcessImpl extends XMPPProcessorAbstract implements XMPPProcessorIfc{  
  4.   
  5.     /** Class loggeer */  
  6.     private static final Logger log = Logger.getLogger(SearchProcessImpl.class.getName());  
  7.     private static final SimpleParser parser = SingletonFactory.getParserInstance();  
  8.   
  9.     private static final String[] searchConditions = new String[]{"userId", "email"};  
  10.     private static final String XMLNS = "jabber:iq:search";  
  11.     private static final String[] ELEMENTS = { "query" };  
  12.     /** Define the plugin ID **/  
  13.     private static final String ID = XMLNS;  
  14.   
  15.     @Override  
  16.     public void processFromUserToServerPacket(JID connectionId, Packet packet,  
  17.             XMPPResourceConnection session, NonAuthUserRepository repo,  
  18.             Queue<Packet> results, Map<String, Object> settings)  
  19.             throws PacketErrorTypeException {  
  20.         //處理客戶(hù)端發(fā)送過(guò)來(lái)的packet  
  21.           
  22.     }  
  23.   
  24.   
  25.     @Override  
  26.     public void processServerSessionPacket(Packet packet,  
  27.             XMPPResourceConnection session, NonAuthUserRepository repo,  
  28.             Queue<Packet> results, Map<String, Object> settings)  
  29.             throws PacketErrorTypeException {  
  30.         //處理服務(wù)器內(nèi)部的packet  
  31.   
  32.     }  
  33.   
  34.     @Override  
  35.     public String id() {  
  36.          return ID; }  
  37.   
  38.   
  39.     @Override  
  40.     public String[] supElements() {  
  41.          return ELEMENTS;  
  42.     }  
  43.   
  44.     /** 
  45.      * Method description 
  46.      * 
  47.      * 
  48.      * @return 
  49.      */  
  50.     @Override  
  51.     public String[] supNamespaces() {  
  52.         return new String[]{XMLNS};  
  53.     }  
  54.   
  55. }  

 

該方法用于在tigase中實(shí)現(xiàn)XMPP協(xié)議中的java:iq:search功能。

 

寫(xiě)完之后修改啟動(dòng)配置文件ini.properties為:

  1. --sm-plugins=......,+java:iq:search  

 

其中java:iq:search與類(lèi)中的ID屬性值相同

 

此時(shí),當(dāng)你用PIS在客戶(hù)端想服務(wù)器端發(fā)送如下XML片段的時(shí)候:

  1. <iq type="get"  
  2. id="12244603"  
  3. to="tigase-com">  
  4. <query xmlns="jabber:iq:search">  
  5. </query>  
  6. </iq>  

 類(lèi)中的方法processFromUserToServerPacket()將會(huì)被調(diào)用

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多