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

}

}

相关推荐
ym hyd 1117 分钟前
门诊挂号系统源码 Java+SpringBoot+Vue3 前后分离
java·vue.js·spring boot·毕设
杨丰玮4189 分钟前
C语言核心语法
java·c语言·开发语言·学习方法
海宇AI15 分钟前
Java数据工程:利用海宇婚恋风险报告优化高端婚恋实名与涉诉核验合规体验
java·人工智能
CEZ20 分钟前
中小企业上 WMS 该先上哪几块:JeeWMS 开源 Java 仓库管理系统的分批上线清单
java·开源
Wang's Blog29 分钟前
Java框架 SpringCloud 快速入门: Gateway 路由的过滤器配置
java·spring cloud·gateway
迅猛龙办公室1 小时前
python实现简单进度条
java·前端·python
斯内普吖1 小时前
(开源)宠物饲养系统实战指南 基于 Java + SSM + Vue + MySQL
java·vue.js·mysql·开源·宠物
知守观1 小时前
Spring Boot 2.1 → 3.5 迁移推演:这个 2018 年的项目会炸在哪
java·spring boot
Flynt1 小时前
800KB 的 JSON 吃掉 8.5 秒 CPU:jackson 这波修复里,最容易被漏掉的洞藏在字符串里
java·安全
后端LV1 小时前
Caffeine 快到 1450 万 ops/s,为什么我还是不敢说数据一致
java·后端