openfire是一個擴張性比較好的xmpp服務器框架,最近公司准備用這個做移動端im,然后就研究了下用戶數據庫的整合...
用戶整合是比較簡單的...網上很多資料...在系統屬性里添加個用戶數據庫的連接,再加幾個基本的查詢用戶的sql,定義一些用戶字段的映射,基本就ok了,不用寫寫什么代碼..
然后就是整合好友列表,一般不太會有這個需求,因為差不多只用這個當im,好友列表都走自己的接口,但是像spark這樣的客戶端是走的openfire自帶的好友關系,所以要讓這個里邊顯示自己用戶系統中的好友列表的話,就需要整合好友列表..然后去網上找這個..沒找到有關資料..
接下來就用jd看了下openfire反編譯后的源碼...
包的結構和清晰,按模塊分包.
發現好友關系模塊(包名org.jivesoftware.openfire.roster)里邊值有一個DefaultRosterItemProvider 並沒有像用戶模塊一樣有JDBCProvider的擴展..
所有我們就得自己來實現這個東西了...
但是怎么讓openfire用我們自己實現的模塊有事個問題...開始想過自己實現一個直接覆蓋jar包里的class,但始終感覺不妥..
然后就找它的根....
發現在 RosterManager 這個類里邊實例化 RosterItemProvider 的時候會在系統屬性里找 provider.roster.className 這個屬性....驚喜中~~~
如果有這個屬性他會把這個屬性所指向的類作為好友管理類.. 你只用實現 RosterItemProvider 接口
1 package org.jivesoftware.openfire.roster; 2 3 import java.util.Iterator; 4 import org.jivesoftware.openfire.user.UserAlreadyExistsException; 5 import org.jivesoftware.openfire.user.UserNotFoundException; 6 7 public abstract interface RosterItemProvider 8 { 9 public abstract RosterItem createItem(String paramString, RosterItem paramRosterItem) 10 throws UserAlreadyExistsException; 11 12 public abstract void updateItem(String paramString, RosterItem paramRosterItem) 13 throws UserNotFoundException; 14 15 public abstract void deleteItem(String paramString, long paramLong); 16 17 public abstract Iterator<String> getUsernames(String paramString); 18 19 public abstract int getItemCount(String paramString); 20 21 public abstract Iterator<RosterItem> getItems(String paramString); 22 }
然后更加自己的用戶系統結構給查接口中需要的數據(具體可以參考 DefaultRosterItemProvider 的實現)
openfire好友關系表字段解釋可參考 http://hi.baidu.com/wangguoqingsll/item/77cec2f1fce2bc7d3d198b81
下邊是我用的幾個字段的值(寫死了,因為我們是sns用戶系統,單向好友關系)
//substate 2
//askstatus -1
//recvstatus -1