【发布时间】:2016-08-19 21:38:57
【问题描述】:
我有 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 都是按发送时间排列的。所以我可以在这里进行排序以按顺序获取消息。
知道每个收到的数据包都会触发它自己的接收器实例。这将使设备一次充满大量消息。这可能会导致问题。
【问题讨论】:
标签: java android ejabberd smack