Так что это правильное поведение для заданного вами уровня QOS. Вы устанавливаете флаг QOS на QoS.AT_MOST_ONCE.toString()
. Это называется уровнем QOS 2.
Небольшая сводка QOS 2 - только один раз
Этот уровень гарантирует, что сообщение будет доставлено только один раз. Если есть проблемы с сетью, и он не может доставить его, сообщение останется в очереди клиента, пока доставка не будет возможна. Это самый медленный уровень QOS, поскольку он требует 4 сообщений.
Отправитель отправляет сообщение и ожидает подтверждения (PUBREC)
Получатель отправляет сообщение PUBREC
Если отправитель не получает подтверждение (PUBREC), он отправляет сообщение повторно.
с установленным флагом DUP.
- Когда отправитель получает подтверждающее сообщение PUBREC, он затем отправляет сообщение об освобождении сообщения (PUBREL).
- Если отправитель не получает PUBREL, он отправляет сообщение PUBREC
- Когда получатель получает сообщение PUBREL, он может теперь переслать сообщение любым подписчикам.
- Получатель затем отправляет завершенную публикацию (PUBCOMP).
- Если отправитель не получает сообщение PUBCOMP, он отправляет сообщение PUBREL повторно.
- Когда отправитель получает PUBCOMP, процесс завершается, и он может удалить сообщение из исходящей очереди.
См. Эту запись в блоге для получения дополнительной информации .
Наиболее важной частью является то, что в вашем случае приемник недоступен, поэтому протокол MQTT для QOS 2 не может быть завершен.