我有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是爲了如果他們的發送時間。所以我可以在這裏做一個排序來獲得消息的順序。
知道每個發出它自己的接收器實例的數據包。這將使設備一次充滿大量消息。這可能會導致問題。
嘿。感謝您的回覆。你能告訴我如何獲得我正在使用的ejabberd服務器的當前版本嗎? –
您可以使用sudo ejabberdctl狀態輸出獲取版本---- 節點'[email protected]'以狀態啓動:啓動 ejabberd 16.02正在該節點中運行 –
sudo ejabberdctl狀態(如果從源安裝則工作)否則像我這樣使用sudo /opt/ejabberd-16.02/bin/ejabberdctl狀態 –