如何在向客户端发送消息时强制 Openfire 请求确认,如果 none,则返回另存为离线

How to force Openfire to request ack when sending message to clients and if none, returned save as offline

希望您今天过得愉快。我们等待 Openfire 实现 StreamManagement 功能已经很长时间了,现在我们有了它 运行。但是Openfire丢包的真实问题场景还是一样。

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

我已经尝试了很多方法来解决这个问题(玩过 StreamManagement_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);

这是一个 BUG,请在此处查看:

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

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

这就是为什么消息从另一个客户端发送并丢失的原因,因为第一个客户端显示为在线,但实际上并没有,而且消息永远不会收到送达回执。