Брокер mosquitto сохраняет несколько сообщений

У меня есть брокер mosquitto, работающий на Ubuntu на EC2. Также я внес изменения max_queued_messages 1000 и max_inflight_messages 10 в /etc/mosquitto/mosquitto.conf

Я публикую для этого брокера с qos = 2 и включенным удержанием. Для публикации использую mosquitto_pub -t 1 -m "{c:{d:\"pN\",m:\"Pr1\"}}" -r -q 2. На стороне подписчика я использую библиотеку org.eclipse.paho.android.service:1.0.2 с таким же qos = 2.
и предоставляет только одну опцию options.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1) для параметров client.connect(options).

Проблема возникает, если абонентское устройство, подключенное к серверу, отключается и повторно подключается по какой-либо причине, а затем получает только одно последнее сохраненное сообщение, в нем отсутствуют все промежуточные сообщения.
А также, если еще ничего не опубликовано, все равно после повторного подключения появляется последнее сохраненное сообщение, которое абонентское устройство могло уже получить до отключения.

Я хочу, чтобы после переподключения абонент получал все сообщения, которые были опубликованы в период отключения, и если уже были получены, то больше не показывались. Хотел знать, как и где это делать.


person Samrat Das    schedule 29.03.2016    source источник


Ответы (1)


Последнее сохраненное опубликованное сообщение всегда будет доставлено при подписке на тему, даже если оно уже было доставлено до какого-либо уровня QOS. Это сделано намеренно, и его невозможно остановить, если сообщение опубликовано как сохраненное. (Чтобы быть ясным, публикация сообщения с флагом сохраненного сообщения заменит последнее сохраненное сообщение и не помещает в очередь все сохраненные сообщения.)

Что касается того, что сообщения не публикуются между отключением / повторным подключением, это означает, что клиент передает параметр подключения cleansession=true. Если вы хотите, чтобы пропущенные сообщения доставлялись, вам необходимо убедиться, что флаг cleansession установлен на false во время соединения. Это полностью не зависит от того, публикуются ли сообщения с сохраненным флагом.

person hardillb    schedule 29.03.2016
comment
теперь добавлены options.setCleanSession (false); а для идентификатора клиента я использую imei no, чтобы он оставался уникальным и одинаковым при каждом повторном подключении клиента. По-прежнему не получаете пропущенное сообщение, о чем еще нужно позаботиться? либо в брокере, либо в пахо-клиенте? - person Samrat Das; 30.03.2016
comment
Ой, извините, он работает, для тестирования я уничтожал службу с отпиской и отключением и при отключении. Он не получает сообщение, но когда я только выключаю Интернет и запускаю, он получает все пропущенные сообщения. Это то, что мне действительно нужно. Большое спасибо :-) - person Samrat Das; 30.03.2016