Mosquitto MQTT получил слишком много публикаций в процессе ошибки - PullRequest
0 голосов
/ 27 сентября 2018

Мы используем mosquitto в нашем проекте для подключения наших IoT-устройств к облаку.

Однако мы всегда получаем ошибку «слишком много публикаций в процессе», когда есть только 30 устройств (сервер имеет 3.1 CPU и 8GБАРАН).

Мы попытались установить qos на 0,1,2.Однако никто не работал.

Может кто-нибудь дать несколько советов, как это исправить?

publishmesssage

public static void publishMessage(MqttPubMsg config) {
    String clientId = MqttClient.generateClientId();
    MemoryPersistence persistence = new MemoryPersistence();

    MqttClient sampleClient = new MqttClient(config.getBroker(), clientId, persistence);
    MqttConnectOptions connOpts = new MqttConnectOptions();
    connOpts.setCleanSession(true);
    connOpts.setUserName(config.getUsername());
    connOpts.setPassword(config.getPassword().toCharArray());
    connOpts.setConnectionTimeout(mqttConnectTimeout);
    connOpts.setKeepAliveInterval(mqttKeppAliveInterval);

    sampleClient.connect(connOpts);
    MqttMessage message = new MqttMessage(config.getContent());
    message.setQos(0);
    sampleClient.publish(config.getTopic(), message);
    System.out.println("Message published");
}

mosquitto.conf

max_inflight_messages 0
max_queued_messages   0
max_connections -1

подписаться на сообщение

public static void subscribeMessage(MqttSubMsg config) {
    System.out.println(config.getBroker());
    String clientId = MqttClient.generateClientId();

    MemoryPersistence persistence = new MemoryPersistence();

    MqttClient sampleClient = new MqttClient(config.getBroker(), clientId, persistence);
    MqttConnectOptions connOpts = new MqttConnectOptions();
    connOpts.setCleanSession(true);
    connOpts.setUserName(config.getUsername());
    connOpts.setPassword(config.getPassword().toCharArray());
    connOpts.setConnectionTimeout(mqttConnectTimeout);
    connOpts.setKeepAliveInterval(mqttKeppAliveInterval);

    System.out.println("run receive...");
    sampleClient.setCallback(new controllers.PushCallback());
    MqttTopic mtopic = sampleClient.getTopic(config.getTopic());
    connOpts.setWill(mtopic, "close".getBytes(), 0, true);
    sampleClient.connect(connOpts);

    int[] Qos = {0};
    String[] topic1 = {config.getTopic()};
    sampleClient.subscribe(topic1, Qos);
}

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Позвольте мне показать, как решить такие проблемы самостоятельно -

Откройте веб-страницу Github для клиента Paho и найдите «слишком много публикаций в процессе»:

browser screenshot

Это приводит вас к строке "32202", ищите ее снова.

Это приводит вас (после пропуска нескольких файлов локализации) к константе в исходном коде Javafile MqttException.java :

public static final short REASON_CODE_MAX_INFLIGHT = 32202;

И снова найдите «REASON_CODE_MAX_INFLIGHT» - что в итоге приведет вас к файлу ClientState.java :

    if (actualInFlight >= this.maxInflight) {
        //@TRACE 613= sending {0} msgs at max inflight window
        log.fine(CLASS_NAME, methodName, "613", new Object[]{new Integer(actualInFlight)});

        throw new MqttException(MqttException.REASON_CODE_MAX_INFLIGHT);
    }

Так что вам нужно настроить свойство maxInflight.

Еще несколько запросов, и вы узнаете, что его можно установить, вызвав метод setMaxInflight(int maxInflight) для MqttConnectionOptions объект, который вы передаете методу connect клиента Paho.

0 голосов
/ 27 сентября 2018

Это не имеет ничего общего с комаром, это клиент, которым вы пользуетесь.См. Этот ответ: Отправить много опубликовать сообщение: Слишком много в процессе публикации Ошибка

...