我有ejabberd作为我的本地服务器和 smack作为 android 端 api。
当用户上线并且有大量离线消息需要传递时,ejabberd 服务器只会向我发送大量消息。我收到了每条消息,但顺序并不完美。 消息发送和保存在服务器中的顺序不是我接收消息的方式。
我可以通过OfflineMessageManager处理smack上的离线消息类(class) 。但这在 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 16.02 或最新版本支持灵活离线消息检索 (XEP-0013)。下载并安装最新版本的 ejabberd。 check this link
关于java - 在ejabberd中处理异步消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36858496/