java - 在ejabberd中处理异步消息

标签 java android ejabberd smack

我有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/

相关文章:

java - 递归程序中的错误

android - 自定义不确定进度条

ubuntu - AWS Ubuntu : Configure Ejabberd Hosts from Snap Store

javascript - ejabberd——在 ejabberd 上设置昵称在我登录之前不会反射(reflect)在 Pidgin/Empathy 上

centos7 - 使用 LetsEncrypt 证书进行 Ejabbed

java - 计算不同方法的执行时间

java - 如何在 Java 中验证数独网格的有效性?

java - 为什么instanceof在android上进行内存分配?

java - 我如何知道我在 Resume 上启动的任务正在运行?

java - Java 中的正则表达式点运算符似乎总是贪婪地工作