Apache Camel MQTT - не возникает исключение, когда брокер сообщений не работает - PullRequest
0 голосов
/ 05 сентября 2018

В настоящее время я работаю с Apache Camel и его компонентом MQTT. У меня есть маршрутные сообщения от брокера (Apache ActiveMQ artemis) и еще один отправляющий ему сообщения. Проблема заключается в том, что не возникает исключение, когда посредник сообщений недоступен. Более того, все сообщения, которые не были отправлены, хранятся в памяти в ожидании возможного перезапуска сервера, что вызывает переполнение памяти. Я не знаю, связано ли это с самим протоколом MQTT или с конфигурацией конечной точки.

Вот моя конфигурация:

    MQTTEndpoint mqttEndpoint = null;

    mqttEndpoint = (MQTTEndpoint) mqttComponent.createEndpoint(MQTT_BROKER);

    mqttEndpoint.getConfiguration().setHost(properties.getBrokerAddress());     
    mqttEndpoint.getConfiguration().setPublishTopicName(publishTopicName);
    //mqttEndpoint.getConfiguration().setSubscribeTopicNames(subscribreTopicNames);
    mqttEndpoint.getConfiguration().setUserName(properties.getBrokerUsername());
    mqttEndpoint.getConfiguration().setPassword(properties.getBrokerPassword());
    mqttEndpoint.getConfiguration().setSslContext(createSSLContext());
    mqttEndpoint.getConfiguration().setByDefaultRetain(false);
    mqttEndpoint.getConfiguration().setQualityOfService(QoS.AT_MOST_ONCE.toString());
    mqttEndpoint.getConfiguration().setConnectAttemptsMax(1);
    mqttEndpoint.getConfiguration().setConnectWaitInSeconds(5);
    mqttEndpoint.getConfiguration().setReconnectBackOffMultiplier(1);
    mqttEndpoint.getConfiguration().setDisconnectWaitInSeconds(3);      
    mqttEndpoint.setCamelContext(camelCtx);

1 Ответ

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

Так что это правильное поведение для заданного вами уровня QOS. Вы устанавливаете флаг QOS на QoS.AT_MOST_ONCE.toString(). Это называется уровнем QOS 2.

Небольшая сводка QOS 2 - только один раз

Этот уровень гарантирует, что сообщение будет доставлено только один раз. Если есть проблемы с сетью, и он не может доставить его, сообщение останется в очереди клиента, пока доставка не будет возможна. Это самый медленный уровень QOS, поскольку он требует 4 сообщений.

  1. Отправитель отправляет сообщение и ожидает подтверждения (PUBREC)

  2. Получатель отправляет сообщение PUBREC

  3. Если отправитель не получает подтверждение (PUBREC), он отправляет сообщение повторно. с установленным флагом DUP.

  4. Когда отправитель получает подтверждающее сообщение PUBREC, он затем отправляет сообщение об освобождении сообщения (PUBREL).
  5. Если отправитель не получает PUBREL, он отправляет сообщение PUBREC
  6. Когда получатель получает сообщение PUBREL, он может теперь переслать сообщение любым подписчикам.
  7. Получатель затем отправляет завершенную публикацию (PUBCOMP).
  8. Если отправитель не получает сообщение PUBCOMP, он отправляет сообщение PUBREL повторно.
  9. Когда отправитель получает PUBCOMP, процесс завершается, и он может удалить сообщение из исходящей очереди.

См. Эту запись в блоге для получения дополнительной информации .

Наиболее важной частью является то, что в вашем случае приемник недоступен, поэтому протокол MQTT для QOS 2 не может быть завершен.

...