2012-02-24 53 views
1

我已經通過擴展AbstractComponent類構建基礎上,捶庫外部的Openfire組件。我希望客戶訂閱我的組件,並在組件上線和下線時收到狀態通知。所以我的問題是我們如何處理基於AbstractComponent的外部組件的狀態和狀態訂閱?openfire外部組件如何處理存在和訂閱?

目前我可以用handlePresence()方法存在響應請求,但我怎麼應該添加客戶端組件名冊(沒有外部元件允許名單擺在首位)?

@Override 
protected void handlePresence(Presence presence){ 
    if (presence.getType() == Presence.Type.subscribe){ 
     System.out.println("The component has received Subscribtion request."); 
     Presence original = presence; 
     Presence response = new Presence(); 
     //Swap the sender/recipient fields 
     response.setTo(original.getFrom()); 
     response.setFrom(original.getTo()); 
     //Convert the text to upper case 
     response.setType(Presence.Type.subscribed); 
     send(response); 

    } 
} 

回答

2

組件沒有服務器提供的名單。如果需要,您可以將自己的名單存儲在數據庫中。有些應用程序根本沒有花名冊(當他們只是想在網上向所有人顯示時)。

爲了所有人顯示爲在線(最簡單的方法,不需要名冊存儲):

  • 當您收到<presence type="subscribed"/>
  • <presence type="subscribe"/>回覆當您收到<presence/><presence type="probe"/>應答(或你想成爲哪種狀態顯示爲)

要存儲花名冊需要多一點工作,但可以讓您跟蹤誰有權查看您的存在,以及誰的pr您有權查看的信息。在某些情況下,如果你不想管理自己的名單,你可能更喜歡在這裏使用正常的客戶端連接。 Jack Moffitt在這裏寫了一篇關於這個主意的博客文章:http://metajack.im/2008/08/04/thoughts-on-scalable-xmpp-bots/

請注意,在整篇文章中,我忽略了段落中的'to'和'from'屬性。這要取決於組件在發送節中放置'to'和'from'。所有傳入的節將有一個'到'和'從'。

顯示組件的存在給用戶

你需要處理的基本傳入節是:

  • <presence type="subscribe">

    • 發送者希望訂閱你的存在更新。你可以批准或拒絕這個。如果您批准,則應將發件人的JID存儲在數據庫中,以便在需要時知道您需要向他們發送您的狀態更新。
    • 規格:http://xmpp.org/rfcs/rfc6121.html#sub-request-handle
  • <presence type="unsubscribe">

    • 發送者希望停止從你接收狀態更新。你應該從人們訂閱您的更新列表中刪除它們,然後發回<presence type="unsubscribed"><presence type="unavailable">
    • 規格:http://xmpp.org/rfcs/rfc6121.html#sub-cancel-inbound(雖然文朝比組件的服務器定製更多在這裏)。
  • <presence type="probe">
    • 發件人要求您提供當前存在。只需回覆該用戶的最新狀態欄即可。這是由用戶的服務器登錄時通常發送。

接收用戶的呈現在組件

此外,如果您希望組件知道用戶的存在,你需要向他們發送訂閱請求:<presence type="subscribe">。您應該準備好接受批准(<presence type="subscribed">)或拒絕(<presence type="unsubscribed">)。

當組件首次上線時,它可以通過向每個用戶發送<presence type="probe">來獲取用戶的當前狀態。在組件正在運行時,不需要每個用戶多次執行此操作 - 如果用戶批准了上述訂閱請求,則用戶的服務器將自動向您發送狀態更新。

+0

如果服務器沒有存儲組件的名單,那麼訂閱的範圍是什麼?服務器重新啓動後它會持續嗎?如果組件連接重新啓動會怎麼樣? – Piyush 2017-05-10 18:56:23