Rabbitmq 发送多个发布消息:进行中的发布太多错误
以下是paho异步客户端:Rabbitmq 发送多个发布消息:进行中的发布太多错误,rabbitmq,mqtt,paho,Rabbitmq,Mqtt,Paho,以下是paho异步客户端: client = new MqttAsyncClient(appProps.getProperty("mqtt.broker"), appProps.getProperty("mqtt.clientId"), new MemoryPersistence()); client.setCallback(this); client.connect(null, new IMqttActionListener() {
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查看Paho客户机的默认最大机上消息数,任何给定时间的默认最大机上消息数为10
因此,考虑到您的发布循环有多紧,在网络层只需要稍微放慢速度,在任何给定时间发送消息的过程中,最终都会收到10条以上的消息。如果尝试以大于0的QOS发送,则情况只会变得更糟
您可以在传递给client.connect()
方法的MQTTConnectionsOptions
对象上,使用setMaxInflight(int n)
方法更改默认值
我建议您尝试找到一个合适的值。一些上下文在这里非常有用,比如队列中有多少消息?当错误到达时,您在列表中的位置有多远?我有一个1000个列表,我正在迭代。我发现在达到200-300后,它的开始投掷错误。还有一件事,那时候所有1000个主题都没有订户。因此,仅仅是一个发布者没有订阅web应用程序这是一个常见的扫描,您从您的web用户那里收到1000条消息,并且必须交付。那么这些假设是如何处理的呢?为限制设置一个合适的值。你也不应该真的将同一条消息发布到1000个不同的主题,发布到1个主题,然后拥有1000个订阅者。你将如何设计一个场景。假设您有1M篇文章,每次在文章中添加评论时,都应通知对该特定文章发表评论的所有其他用户。我所做的是,当用户评论他们订阅的故事主题时,我遍历所有用户id并向每个故事的
user/
topicA主题发送消息