communication
runtime_error
ai_generated
true
MQTT publish failed: no subscribers matched topic filter
ID: communication/mqtt-publish-failed-no-subscribers
75%Fix Rate
82%Confidence
1Evidence
2024-03-22First Seen
Version Compatibility
| Version | Status | Introduced | Deprecated | Notes |
|---|---|---|---|---|
| Mosquitto 2.0.15 | active | — | — | — |
| Paho MQTT 1.6.1 | active | — | — | — |
| EMQX 5.0.0 | active | — | — | — |
Root Cause
The MQTT broker discards the published message because no active subscribers are subscribed to the topic or any wildcard matching it.
generic中文
MQTT 代理丢弃发布的消息,因为没有活动订阅者订阅该主题或任何匹配的通配符主题。
Official Documentation
https://mqtt.org/mqtt-specification/Workarounds
-
80% success Ensure at least one subscriber is connected before publishing: In the publisher code, implement a callback to wait for a subscriber presence notification or use a separate health-check topic. For example, in Eclipse Paho Python client, subscribe to '$SYS/broker/clients/connected' to monitor.
Ensure at least one subscriber is connected before publishing: In the publisher code, implement a callback to wait for a subscriber presence notification or use a separate health-check topic. For example, in Eclipse Paho Python client, subscribe to '$SYS/broker/clients/connected' to monitor.
-
75% success Use MQTT 5.0 subscription identifiers to track active subscribers: Set `SubscriptionIdentifier` in the publish packet and check broker response for 'no matching subscribers' reason code.
Use MQTT 5.0 subscription identifiers to track active subscribers: Set `SubscriptionIdentifier` in the publish packet and check broker response for 'no matching subscribers' reason code.
-
85% success Configure the broker to store undelivered messages with a queue for offline subscribers: In Mosquitto, set `persistence true` and use `max_queued_messages 1000` with a clean session false for the subscriber.
Configure the broker to store undelivered messages with a queue for offline subscribers: In Mosquitto, set `persistence true` and use `max_queued_messages 1000` with a clean session false for the subscriber.
中文步骤
Ensure at least one subscriber is connected before publishing: In the publisher code, implement a callback to wait for a subscriber presence notification or use a separate health-check topic. For example, in Eclipse Paho Python client, subscribe to '$SYS/broker/clients/connected' to monitor.
Use MQTT 5.0 subscription identifiers to track active subscribers: Set `SubscriptionIdentifier` in the publish packet and check broker response for 'no matching subscribers' reason code.
Configure the broker to store undelivered messages with a queue for offline subscribers: In Mosquitto, set `persistence true` and use `max_queued_messages 1000` with a clean session false for the subscriber.
Dead Ends
Common approaches that don't work:
-
Publish with QoS 2 to guarantee delivery even without subscribers
85% fail
QoS levels do not create subscribers; the broker still drops the message if no one is subscribed.
-
Enable broker's retained messages feature to store the last message
70% fail
Retained messages only store the last message per topic; they don't affect delivery of new messages to non-existent subscribers.
-
Set the 'clean session' flag to false on the publisher
90% fail
The clean session flag applies to client session state, not subscriber existence; it doesn't create subscribers.