mqtt 发送消息过多_(5条消息)使用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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MQTT 协议中,消息发送和接收是非常重要的。Eclipse Paho 是一个 MQTT 客户端库,支持多种编程语言,例如 Java、C++、Python 等。本文将重点介绍 Eclipse Paho消息发送和接收。 一、消息发送 1.1 发送消息的基本流程 在 Eclipse Paho 中,发送消息的基本流程如下: 1. 创建一个 MqttClient 对象。 2. 连接到 MQTT 服务端。 3. 创建一个 MqttMessage 对象,设置消息的内容和 QoS 等级。 4. 调用 MqttClient 的 publish() 方法发送消息。 5. 断开 MQTT 连接。 1.2 代码示例 下面是一个使用 Eclipse Paho 发送消息的 Java 代码示例: ```java import org.eclipse.paho.client.mqttv3.*; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; public class MqttPublishSample { public static void main(String[] args) { String topic = "MQTT Examples"; String content = "Message from MqttPublishSample"; int qos = 2; String broker = "tcp://localhost:1883"; String clientId = "JavaSample"; MemoryPersistence persistence = new MemoryPersistence(); try { MqttClient sampleClient = new MqttClient(broker, clientId, persistence); MqttConnectOptions connOpts = new MqttConnectOptions(); connOpts.setCleanSession(true); sampleClient.connect(connOpts); MqttMessage message = new MqttMessage(content.getBytes()); message.setQos(qos); sampleClient.publish(topic, message); sampleClient.disconnect(); System.out.println("Message published"); } catch(MqttException me) { System.out.println("Reason: " + me.getReasonCode()); System.out.println("Message: " + me.getMessage()); System.out.println("Loc: " + me.getLocalizedMessage()); System.out.println("Cause: " + me.getCause()); System.out.println("Excep: " + me); me.printStackTrace(); } } } ``` 在这个代码示例中,我们创建了一个 MqttClient 对象,并连接到本地的 MQTT 服务器。然后,我们创建了一个 MqttMessage 对象,设置了消息的内容和 QoS 等级,并使用 publish() 方法将消息发送到指定的主题。 1.3 QoS 等级 在 MQTT 协议中,有三种不同的 QoS 等级:0、1 和 2。QoS 等级越高,消息的可靠性越高,但是网络负载也会相应增加。 - QoS 0:最多发送一次,没有确认,可能会出现消息丢失或重复。 - QoS 1:至少发送一次,确保消息至少被接收一次,但可能会出现重复消息。 - QoS 2:只发送一次,确保消息仅被接收一次,但网络负担较大。 二、消息的接收 2.1 接收消息的基本流程 在 Eclipse Paho 中,接收消息的基本流程如下: 1. 创建一个 MqttClient 对象。 2. 连接到 MQTT 服务端。 3. 创建一个 MqttCallback 对象,用于处理接收到的消息。 4. 订阅一个或多个主题。 5. 等待接收消息。 6. 断开 MQTT 连接。 2.2 代码示例 下面是一个使用 Eclipse Paho 接收消息的 Java 代码示例: ```java import org.eclipse.paho.client.mqttv3.*; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; public class MqttSubscribeSample { public static void main(String[] args) { String topic = "MQTT Examples"; String broker = "tcp://localhost:1883"; String clientId = "JavaSample"; MemoryPersistence persistence = new MemoryPersistence(); try { MqttClient sampleClient = new MqttClient(broker, clientId, persistence); MqttConnectOptions connOpts = new MqttConnectOptions(); connOpts.setCleanSession(true); sampleClient.connect(connOpts); sampleClient.setCallback(new MqttCallback() { public void connectionLost(Throwable cause) { System.out.println("Connection lost"); } public void messageArrived(String topic, MqttMessage message) throws Exception { System.out.println("Message received: " + new String(message.getPayload())); } public void deliveryComplete(IMqttDeliveryToken token) { System.out.println("Delivery complete"); } }); sampleClient.subscribe(topic); // Wait for messages Thread.sleep(5000); sampleClient.disconnect(); System.out.println("Disconnected"); } catch(MqttException me) { System.out.println("Reason: " + me.getReasonCode()); System.out.println("Message: " + me.getMessage()); System.out.println("Loc: " + me.getLocalizedMessage()); System.out.println("Cause: " + me.getCause()); System.out.println("Excep: " + me); me.printStackTrace(); } catch(InterruptedException e) { e.printStackTrace(); } } } ``` 在这个代码示例中,我们创建了一个 MqttClient 对象,并连接到本地的 MQTT 服务器。然后,我们创建了一个 MqttCallback 对象,用于处理接收到的消息。在 MqttCallback 的 messageArrived() 方法中,我们可以处理接收到的消息。 最后,我们使用 subscribe() 方法订阅了一个主题,并等待 5 秒钟接收消息。在接收完消息之后,我们断开了 MQTT 连接。 总结 在本文中,我们介绍了使用 Eclipse Paho 发送和接收 MQTT 消息的基本流程,并提供了 Java 代码示例。同时,我们还介绍了 MQTT 的 QoS 等级。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值