基於XMPP協議(openfire伺服器)的訊息推送實現

風的王子發表於2013-11-06
  • 訊息推送實現原理
        這裡的訊息推送,通常是指由伺服器端向客戶端傳送的一些訊息,比如待辦事宜、新聞等等。
        從技術角度來看,訊息推送本質上是基於TCP/IP的網路IO流傳輸,只不過這個IO流看起來由伺服器發起,從上面的條件來看,一個基本的訊息推送框架的Java實現應該是這樣的:有一個用Java NIO實現的伺服器,多個用socket連線到此伺服器的客戶端,然後之間用二進位制流傳輸資訊。說起來簡單,實現起來卻很不容易,所幸基於XMPP協議的openfire剛好符合上述條件,不僅如此,這種方案還有如下優點:
  1. openfire是開源的,用Java寫的,這對Java程式設計師來說很重要。。。
  2. XMPP協議採用XML流傳輸訊息,可讀性和可擴充套件性優秀,便於我們定義自己的推送訊息結構。
  3. XMPP協議在PC和Android分別有對應的協議實現smack和asmack,不用我們寫XML協議解析。
        那麼具體如何實現在openfire中推送訊息呢?我的想法是這樣的:
        當兩個使用者使用openfire中聊天時,訊息是從使用者A經過伺服器流向使用者B,那麼我們可以想象有訊息中心這麼一個使用者,它的作用就是當我們系統有需要時,向某個使用者發一條相應的訊息,我們的客戶端收到這樣一個使用者的訊息時,就將其當做系統訊息,這樣就實現了簡單的訊息推送。
        還有一個問題就是,系統怎麼知道向哪個使用者推送訊息、什麼時候推送訊息,我們可以用http post的方式通知openfire伺服器,用引數指定訊息體和傳送物件。
  • 使用openfire實現訊息推送
         第一步,使用openfire進行訊息推送的前提是在openfire系統中註冊賬號,有關openfire賬號整合自定義資料庫請看我的另一篇文章http://blog.csdn.net/nomousewch/article/details/7546083,這裡就不說了。
         第二步,在openfire中建立一個外掛,這裡貼一下核心程式碼:
  1. public static void pushMessage(JID to, JID from, String body,  
  2.         String subject) {  
  3.     Message message = new Message();  
  4.     message.setFrom(from);  
  5.     message.setTo(to);  
  6.     message.setBody(body);  
  7.   
  8.     if (StringUtils.isNotBlank(subject)) {  
  9.         message.setSubject(subject);  
  10.     }  
  11.   
  12.     XMPPServer.getInstance().getRoutingTable().routePacket(to, message, true);  
  13. }  
         第三步,在外掛中定義一個Servlet,呼叫上述方法。

         第四步,在業務系統中用http client呼叫Servlet,來向指定使用者推送訊息。

相關文章