我有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状态 –