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