首页 > 解决方案 > 如何在向客户端发送消息时强制 Openfire 请求确认,如果没有,则返回保存为离线

问题描述

我希望你今天过得愉快。我们为 Openfire 实现该功能等待了很长时间StreamManagement,现在我们可以运行它了。但是,Openfire 中丢包的真正问题场景仍然保持不变。

客户端断开与互联网的连接,但由于它是在 Openfire 发送下一个 ping 之前,服务器假定客户端已连接并发送消息,这显然是在没有请求客户端确认的情况下发生的。因此,如果它没有发送任何内容,请将其保存为离线。

我已经尝试了很多方法来解决这个问题(玩过StreamManagementand _Resumption_),我能想到的最后一件事是在服务器端编写一个插件并手动完成所有关于存储离线消息的操作,这将需要很长时间。不过我还是觉得这应该有解决办法,不然的话,Openfire就没用了,不是吗?如果有任何解决方案,有人可以帮助我吗?非常感谢。

另外,我想知道,Openfire 不使用 TCP 来维持生命吗?那么,当客户端立即断开连接时,它不应该注意到吗?

我启动与smack连接的方式:

 connInter.getConnection().setReplyTimeout(15000);

    connInter.getConnection().setUseStreamManagement(true);
    //connInter.getConnection().strea
    connInter.getConnection().setUseStreamManagementResumption(true);

    registerReceiver(mConnReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));

    DeliveryReceiptManager
        .getInstanceFor(connInter.getConnection())
            .setAutoReceiptMode(AutoReceiptMode.always);

    ReconnectionManager.setEnabledPerDefault(false);

    SASLMechanism mechanism = new SASLDigestMD5Mechanism();
    SASLAuthentication.registerSASLMechanism(mechanism);
    // SASLAuthentication.blacklistSASLMechanism("SCRAM-SHA-1");
    SASLAuthentication.unBlacklistSASLMechanism("DIGEST-MD5");

    PingManager.setDefaultPingInterval(180);

标签: androidxmppopenfiresmack

解决方案


这是一个BUG在这里检查它:

https://issues.igniterealtime.org/browse/OF-963

这是 Openfire 中的官方错误。您可以设置用户设置为离线的时间间隔。但是在 > 4.0.2 的版本中,无论您设置的时间间隔如何,都存在客户端始终在线的错误。我的 Openfire 安装使用的是 4.0.2 旧版本,因为这个 BUG 尚未修复。

这就是为什么消息从另一个客户端发送并丢失的原因,导致第一个客户端显示为在线,而实际上它不是,并且消息永远不会收到传递的收据。


推荐阅读