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