使用org.eclipse.paho.client.mqttv3 出现 正在进行过多发布的问题 解决方案

.mqttv3支持 MqttClient (同步)、MqttAsyncClient(异步),官方建议使用异步实现,使用返回的token追踪状态,并可以使用 token.waitForCompletion(); 阻塞进程,直到操作完成,

但是请留意,官网有真么一句话:

If a client connects with cleanSession true then there will be no delivery tokens as the cleanSession option deletes all earlier state. For state to be remembered the client must connect with cleanSession set to false

(如果客户端连接到cleanSession true,则不会有任何交付令牌,因为cleanSession选项会删除所有之前的状态。若要记住状态,客户端必须与设为false的清洁状态连接)

这样获取的只是正在发布的所有token,不包含其他token

发布时可以将进程阻塞,同时

// 方法1:if (mqttConnectOptions.getMaxInflight() - mqttAscClient.getInFlightMessageCount() > 0) 
//方法2:if (mqttConnectOptions.getMaxInflight() - mqttAscClient.getPendingDeliveryTokens().length > 0) 

获取正在进行的发布数,如果小于设置的最大发布数,就可以进行新的发布。

方法1:getInFlightMessageCount 只是待队列中的消息数,不是真正发送的消息,必须要保证发送是同步的,使用方法2可以异步发送,
//publish 方法 token.waitForCompletion();可以省略

而方法2:获取的是确切的正在进行的发布,有确定的唯一token

建议使用方法2.

 

==================================================================================

如果认为这篇文章帮到了你,那就请领个红包打赏下吧

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0 jar 是一个基于 Eclipse Paho 的 MQTT 客户端库。MQTT 是一种轻量级的通讯协议,广泛应用于物联网和机器间通信领域。该库提供了在 Java 程序中使用 MQTT 协议进行消息传输的功能。 通过引入 org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0 jar,我们可以在 Java 程序中使用 MQTT 客户端功能。它提供了一系列的类和方法,用于连接到 MQTT 服务器、发布和订阅消息、处理消息回调等等。 使用该库,我们可以轻松建立 MQTT 连接并与其他设备进行通信。我们可以创建 MQTT 客户端对象,通过设置连接参数(如 MQTT 服务器地址、端口号、用户名、密码等)来连接到 MQTT 服务器。连接成功后,我们可以发布消息到指定的 MQTT 主题(topic),也可以订阅感兴趣的主题,接收其他设备发布的消息。 这个库还提供了消息的质量等级(QoS)控制机制,可以确保消息的可靠性和传输质量。它支持三个不同的 QoS 等级:0 表示至多一次的传输,可能会有数据丢失;1 表示至少一次的传输,确保消息到达,但可能会重复传输;2 表示仅一次的传输,确保消息到达且仅传输一次。 总而言之,org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0 jar 提供了在 Java 程序中使用 MQTT 协议进行通信的功能,使我们可以轻松地连接到 MQTT 服务器、发布和订阅消息,并控制消息的质量等级。这使得我们能够更方便地构建物联网和其他机器间通信的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值