2012年11月28日 星期三

Openfire 建立好友訂閱狀態

Openfire的好友訂閱是在table ofRoster中進行管理
資料欄位的說明:
table ofRoster - meaning of sub/ask/recv
http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/database-guide.html#ofRoster

原本的想法是當app透過我們自己的web API建立相關資料時,就自動由web server在ofRoster中寫入相關資料,app不用再透過XMPP向Openfire訂閱

但!!!熟知Openfire在處理roster相關資料時,會先從runtime的cache取,因此就算在ofRoster中寫入相關資料,Openfire也無法及時的返回有異動的資料,除非清除cache

一個比較簡單的方式是在後台介面Server ->Server Manaer -> Cache Summary,手動清除Roster的Cache,不過這在實作上當然是不可行

因此另一個想法就是關掉Roster的Cache ,How to configure Openfire's caches
照文章的說法,在Server  -> System Properties加入兩個參數override預設值
cache.username2roster.maxLifetime 0
cache.username2roster.size 0
然後重啟Openfire
結果.....................................啃!沒有用阿!!! Openfire一樣無法及時返回有異動的資料
查了老半天查不出個所以然
只好走回正規的作法,web server透過呼叫Plugin來達成
以下是簡單的程式


XMPPServer server = XMPPServer.getInstance();
String serverName = server.getServerInfo().getXMPPDomain();

Roster roster = server.getRosterManager().getRoster(fromUserName );
JID toJid = new JID(toUserName + "@" + serverName);
boolean isRosterItem = roster.isRosterItem(toJid);

if (!isRosterItem) {
roster.createRosterItem(toJid, nickname, null, true, true);
}
RosterItem item = roster.getRosterItem(toJid);
item.setNickname(nickname);
item.setSubStatus(RosterItem.SubType.getTypeFromInt(subType));
roster.updateRosterItem(item);

fromUserName : 用戶的id
toUserName  : 訂閱對象的id
nickname : 訂閱對象的匿稱

subType :0  =>  none, 1  =>  from, 2  =>  to, 3  =>  both

短短幾行而已,這次想超捷徑反而花了更多時間....阿門~

沒有留言:

張貼留言