Rabbitmq 发送多个发布消息:进行中的发布太多错误

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() {

以下是paho异步客户端:

    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主题发送消息