Mqtt发送信息报错

Too many publishes in progress (32202) at org.eclipse.paho.client.mqttv3.internal.ClientState.send(ClientState.java:527) at org.eclipse.paho.client.mqttv3.internal.ClientComms.internalSend(ClientComms.java:163) at org.eclipse.paho.client.mqttv3.internal.ClientComms.sendNoWait(ClientComms.java:193)

Too many publishes in progress (32202) 表明 Paho MQTT 客户端同时进行的发布操作太多了,这个错误码 32202 是客户端内部的错误代码,不是服务器返回的

当出现 Too many publishes in progress (32202) 错误时:不会排队等待,也不会自动重试

直接抛出异常,消息丢失!

Paho 的内部逻辑大概是

// 伪代码展示 Paho 的逻辑

public void send(MqttPublish message) {

if (pendingMessages.size() >= maxInflight) {

throw new MqttException(32202, "Too many publishes in progress");

}

pendingMessages.add(message); // 只有没超限才会加入队列

// ... 实际发送逻辑

}

Paho = Eclipse Paho,

是一个开源的 MQTT 客户端库。

简单理解:

你的 Java 代码要发送 MQTT 消息,需要一个"工具"

Paho 就是这个工具(就像 HttpClient 用来发 HTTP 请求一样)

最大飞行消息数

已经发送但还没收到确认的消息

时间 T1: 你发了消息 1 → 等待确认 ✈️

时间 T2: 你发了消息 2 → 等待确认 ✈️

时间 T3: 你发了消息 3 → 等待确认 ✈️

...

时间 T9: 你发了消息 9 → 等待确认 ✈️

时间 T10: 你发了消息 10 → 等待确认 ✈️

此时已经有 10 个消息在"飞行中"

时间 T11: 你想发消息 11

❌ Paho 直接拒绝:Too many publishes in progress!

(因为前 10 个还没收到确认)

时间 T12: 消息 1 的确认回来了 ✅

现在只有 9 个在飞行中

时间 T13: 你可以发消息 11 了 ✅

解决:

1.调大飞行队列

connOpts.setMaxInflight(50);

2.控制并发数

Semaphore publishSemaphore = new Semaphore(20); // 只允许 20 个并发

public void publishMessage(String message) {

publishSemaphore.acquire(); // 先拿许可证

try {

client.publish(...); // 发布消息

} finally {

publishSemaphore.release(); // 释放许可证

}

}

相关推荐
都叫我大帅哥3 小时前
Java JJWT 完全指南:从入门到生产级实践
java
前端开发张小七4 小时前
Java 学习笔记 · 第一课:基础语法与核心概念
java·后端
ThsPool5 小时前
【ENVI二次开发学习整理 04】ENVI功能扩展与二次开发
java·前端·javascript
赤壁小虾5 小时前
【渲染流水线】[逐片元阶段]-[透明度测试]以UnityURP为例
java·前端·数据库
青山木7 小时前
Hot 100 --- 搜索插入位置
java·数据结构·算法·leetcode
Jul1en_7 小时前
【Claude Code Compact】源码级别的学习上下文压缩
java·前端·学习·github·ai编程
摇滚侠7 小时前
《SpringBoot 3:入门与应用实战》第 15 章 生产级特性 管理 Spring Boot 应用 阅读笔记
java·spring boot·笔记
XWalnut7 小时前
SpringBoot快速入门
java·spring boot·后端
前端 贾公子7 小时前
第06章:结构化输出 (上)
java·服务器·前端
念何架构之路7 小时前
restartmanager-重启管理子系统
java·开发语言