发送许多发布消息:正在发布的太多错误

时间:2016-08-03 18:53:28

标签: rabbitmq mqtt paho

这是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

1 个答案:

答案 0 :(得分:5)

查看Paho客户端的source,看起来任何给定时间的默认最大机上信息数都是10.

因此,鉴于您的发布循环有多紧,它只会在网络层中减少一小段速度,并且在任何给定时间发送过程中最终会收到10条以上的消息。如果您尝试以大于0的QOS发送,情况会变得更糟。

您可以使用传递给setMaxInflight(int n)方法的MQTTConnectionsOptions对象上的client.connect()方法更改默认值。

我建议您尝试找到合适的值。