处理ejabberd中的异步消息

时间:2016-04-26 07:46:52

标签: java android ejabberd smack

我有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都是有序的。所以我可以在这里进行排序,以便按顺序获取消息。

知道每个发出的数据包都会触发自己的接收器实例。这将使设备一次充满消息数量。这可能会导致问题。

2 个答案:

答案 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中!