Test Expired Messages

This article is to explain how to generate an “expired” message and how to catch it in the $expired/# topic.

 Instructions

  1. Prepare a HiveMQ broker with a TCP listener on localhost:1883.

  2. On the broker, enable Expired Messages Topic add-on.
    Enabling Expired Messages Topic add-on has 2 workings:

    1. The Expired Messages Topic add-on prefaces the topic of expired messages with $expired/.
      So, if a message published to my/topic/test is expired, it will be published to topic $expired/my/topic/test.

    2. The Expired Messages Topic add-on exposes additional metrics in the HiveMQ standard metrics:

      • com.hivemq.messages.expired-messages

      • com.hivemq.messages.expired.topic.expired.count

        and other metrics.

Following steps explain how to create a situation when a message is expired.

  1. On the localhost, install MQTT CLI command line client.

  2. Start the broker.

  3. To monitor for expired messages, create a client sub-expired with subscription to $expired/# topic filter or a shared subscription $share/shared-expired/$expired:

    mqtt subscribe -i sub-expired -t '$expired/#' -J -d

    where:

    • -i 'sub-expired' – client identifier;

    • -t '$expired/#' – topic filter;

    • -J – output as JSON;

    • -d – verbose output.

  4. Create a client sub-test with subscription to some topic test with a long session expiry and disconnect the client. To disconnect the command line client, terminate its terminal session by pressing Ctrl+C:

    mqtt subscribe -i sub-test -t test -se 6000 --no-cleanStart

    where:

    • -se 6000 – session expiry 600 seconds;

    • --no-cleanStart – persistent session;

  5. In the brokers Control Center → Clients → Refresh View and make sure that the client sub-test is present in the list, subscribed to the topic test and offline.

  6. Publish a message to the topic test from MQTT v.5 client, with a short message expiry and QoS 1.

    mqtt publish -i pub-test -t test -m Hello -V 5 -e 2

    where:

    • -m Hello – message “Hello”;

    • -V 5 – MQTT v.5 client;

    • -e 2 – message expiry 2s;

 

Expected results:

After the message expiry interval (2s) the published message expires and

  1. is published to the topic $expired/test and received by the sub-expired client.

  2. metrics updated
    com.hivemq.messages.expired-messages
    com.hivemq.messages.expired.topic.expired.count

Script for quickly setting up a test environment with HiveMQ with Prometheus and Grafana monitoring: https://github.com/guinp1n/docker-hivemq-with-prometheus