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(); // 释放许可证

}

}

相关推荐
该昵称用户已存在33 分钟前
从成本中心到价值引擎:MyEMS 开源系统激活企业能源数据资产
java·后端·struts
隐退山林34 分钟前
JavaEE进阶:SpringBoot配置文件
java·spring boot·java-ee
阿维的博客日记1 小时前
求解深分页问题,last pk适合什么情况
java·mysql·深分页
极客先躯2 小时前
高级java每日一道面试题-2025年12月09日-实战篇[Docker]-如何配置 Docker 的日志驱动?有哪些日志驱动可选?
java·docker·日志驱动的作用与配置层级·日志驱动全览与对比·日志驱动配置的要点·日志标签定制·容器与宿主机时间戳
rabbit_pro2 小时前
Spring AI使用Ollama
java·人工智能·spring
Mike117.2 小时前
GBase 8a 物化视图依赖和 DDL 风险排查记录
java·服务器·前端
李少兄2 小时前
领域驱动设计与 Clean Code 的实践
java·数据库·领域驱动
老马95273 小时前
opencode7-桌面应用实战2
java·人工智能·后端
李白的天不白3 小时前
大规模请求数据并发问题
java·前端·数据库