Jack BeNimble
Jack BeNimble

Reputation: 36713

MQTT Listener on ActiveMQ Artemis - how to ensure all messages (not just latest) are consumed by subscriber

I would like to use use ActiveMQ Artemis as an MQTT broker to ensure that all subscribers to a MQTT topic will receive the MQTT messages, not just the latest one.

For example, an MQTT subscriber crashes and is unable to receive messages for a while. When the subscriber comes back online, it should receive all the messages that had been published to a topic.

From this post, which give the following graphic:

MQTT Retained messages

it appears that by setting the QOS to 1 and the retain to true, all messages to a topic will be saved until they are consumed by the subscribers. Is this the case?

If necessary, I could add a UUID to the topic. For example, publish to topic mytopic/13234141431432 and subscribe to mytopic/#. However, the first option is preferable just for simplicity sake.

Upvotes: 0

Views: 381

Answers (1)

hardillb
hardillb

Reputation: 59816

Retained is different to QOS delivery requirements.

Setting the retained flag will just tell the broker to hold on to the last message on a given topic with the retained flag set and always deliver that message to any new subscribers (including returning clients that have been offline). Retained is how to ensure a client always gets the current state/last state of a topic, not any of the preceding messages. (Also the retained message may be delivered before any queued messages)

If you want to ensure that all missed messages are delivered to a client that has been offline you must publish and subscribe at QOS 1 or 2 and ensure that the Clean Session flag is false when reconnecting.

Upvotes: 2

Related Questions