这是paho Async客户端:
client = new MqttAsyncClient(appProps.getProperty("mqtt.broker"),
appProps.getProperty("mqtt.clientId"), new MemoryPersistence());
client.setCallback(this);
client.connect(null, new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken imt) {
try {
client.subscribe(Constants.internalTopics, Constants.internalTopicQOS);
} catch (MqttException ex) {
ex.printStackTrace();
}
}
@Override
public void onFailure(IMqttToken imt, Throwable thrwbl) {
thrwbl.printStackTrace();
}
});
这里我正在循环发送消息:
while (iterator.hasNext()) {
try {
client.publish("user/" + userId + "/downstream", mqttMessage);
} catch(Exception ex) {
ex.printStackTrace();
}
}
错误:
Too many publishes in progress (32202)
at org.eclipse.paho.client.mqttv3.internal.ClientState.send(ClientState.java:436)
at org.eclipse.paho.client.mqttv3.internal.ClientComms.internalSend(ClientComms.java:121)
at org.eclipse.paho.client.mqttv3.internal.ClientComms.sendNoWait(ClientComms.java:139)
at org.eclipse.paho.client.mqttv3.MqttAsyncClient.publish(MqttAsyncClient.java:858)
at org.eclipse.paho.client.mqttv3.MqttAsyncClient.publish(MqttAsyncClient.java:836)
我正在使用Rabbitmq
答案 0 :(得分:5)
查看Paho客户端的source,看起来任何给定时间的默认最大机上信息数都是10.
因此,鉴于您的发布循环有多紧,它只会在网络层中减少一小段速度,并且在任何给定时间发送过程中最终会收到10条以上的消息。如果您尝试以大于0的QOS发送,情况会变得更糟。
您可以使用传递给setMaxInflight(int n)
方法的MQTTConnectionsOptions
对象上的client.connect()
方法更改默认值。
我建议您尝试找到合适的值。