我有ejabberd作为本地服务器,smack作为android端api。
当用户上线并且有多个离线消息要传递时,ejabberd服务器只会让我充满信息。我收到每条消息但订单并不完美。 邮件发送和保存在服务器中的顺序不是我收到邮件的方式。
我可以通过OfflineMessageManager课程处理smack上的离线消息。但是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都是有序的。所以我可以在这里进行排序,以便按顺序获取消息。
知道每个发出的数据包都会触发自己的接收器实例。这将使设备一次充满消息数量。这可能会导致问题。
答案 0 :(得分:1)
ejabberd 16.02或最新版本支持灵活脱机消息检索(XEP-0013)。下载并安装最新版本的ejabberd。 check this link
答案 1 :(得分:0)
XEP-0013:灵活的离线消息检索是从2003年开始的,也许现在是时候转向更现代的XEP-0313: Message Archive Management了?它对于多种设备环境来说要好得多,例如同时使用移动和Web应用程序。
MongooseIM强烈支持MAM:MongooseIM 1.6.2支持MAM v0.2,但我们的主分支(下一版本)支持MAM v0.5.1。您可以将消息存档存储在MySQL,PostgreSQL,Riak KV和Cassandra中!