2016-04-26 102 views
0

我有ejabberd作爲我的本地服務器和smack作爲android側api。處理異步消息在ejabberd

當用戶上線並且有很多離線消息要發送時,ejabberd服務器只是給我發送了消息。我收到了每條消息,但訂單並不完美。 郵件發送和保存在服務器中的順序並不是我如何收到郵件。

我可以通過OfflineMessageManager類處理脫機消息。但是這在ejabberd中不受支持。我用supportsFlexibleRetrieval()來檢查它,它返回false。

我也檢查了它與Xabber Android應用程序,令人驚訝的是,在這裏我從ejabberd服務器以正確的順序得到所有的消息。所以問題出在我的Android客戶端。我的接收器如下 -

PacketListener myListener; 
String new_msg_body, new_msg_from; 

final StanzaFilter filter = new AndFilter(new StanzaTypeFilter(Message.class)); 

     PacketCollector myCollector = conn1.createPacketCollector(filter); 

     myListener = new PacketListener() { 
      @Override 
      public void processPacket(Stanza packet) throws SmackException.NotConnectedException { 
       Message msg = (Message) packet; 
       new_msg_body = msg.getBody(); 
       new_msg_from = msg.getFrom(); 
       Log.i("log", "message recived :" + new_msg_body + " from : " + new_msg_from +" msg id : " + msg.getStanzaId()); 
      } 
     }; 

     conn1.addPacketListener(myListener, filter); 

做任何人有任何建議,這個問題。

進展

到現在我已經發現,每封郵件都有id和每個消息的ID是爲了如果他們的發送時間。所以我可以在這裏做一個排序來獲得消息的順序。

知道每個發出它自己的接收器實例的數據包。這將使設備一次充滿大量消息。這可能會導致問題。

回答

1

ejabberd 16.02或最新版本支持靈活的離線消息檢索(XEP-0013)。下載並安裝最新版本的ejabberd。 check this link

+0

嘿。感謝您的回覆。你能告訴我如何獲得我正在使用的ejabberd服務器的當前版本嗎? –

+0

您可以使用sudo ejabberdctl狀態輸出獲取版本---- 節點'[email protected]'以狀態啓動:啓動 ejabberd 16.02正在該節點中運行 –

+1

sudo ejabberdctl狀態(如果從源安裝則工作)否則像我這樣使用sudo /opt/ejabberd-16.02/bin/ejabberdctl狀態 –

0

XEP-0013:靈活的離線消息檢索是從2003年開始的,也許是時候轉移到更現代的XEP-0313: Message Archive Management了?對於多個設備環境來說,這是好得多的,例如移動和網絡應用程序的併發使用。

MongooseIMMAM有很強的支持:MongooseIM 1.6.2支持MAM v0.2,但我們的主分支(下一版本)支持MAM v0.5.1。您可以將您的消息存檔存儲在MySQL,PostgreSQL,Riak KV和Cassandra中!

+0

XEP-0013和XEP-0313解決了不同的問題。提問者問題由XEP-0013解決,而不是由XEP-0313解決。 – Flow