ActiveMQ中Paho.MQTT JavaScript客户端持久订阅创建失败求助
环境信息
- 系统:Ubuntu 22.04.2 LTS
- ActiveMQ版本:Classic v5.17.1
已验证的成功场景
通过命令行工具可成功创建持久订阅,ActiveMQ控制台显示“Active Durable Topic Subscriber”,命令如下:
npx mqtt sub --no-clean -i DAVE --qos 1 --verbose -t "mytopic"
问题场景
使用Paho.MQTT JavaScript客户端通过WebSocket连接MQTT订阅时,订阅成功但未创建持久订阅,ActiveMQ控制台显示“Active non-durable topic subscriber”,初始代码如下:
let client = new Paho.MQTT.Client("localhost", 61614, "DAVID"); client.connect( { onSuccess: onConnect, cleanSession : false } ); function onConnect() { let QOS = 1; client.subscribe("mytopic", { qos: QOS} ); }
已尝试的调整
根据建议将QoS值通过选项对象传递,但仍未创建出持久订阅。调试确认cleanSession标志已被正确解析,且onSubscribe回调显示QoS已被授予。
技术建议
确保客户端ID的唯一性与绑定关系
持久订阅与客户端ID强绑定,检查JS客户端使用的DAVID是否被其他非持久订阅占用,建议测试时复用命令行中有效的DAVE作为客户端ID,验证是否能触发持久化。检查ActiveMQ的WebSocket连接器配置
确认activemq.xml中的MQTT WebSocket连接器未禁用持久化支持,示例配置如下:<transportConnectors> <transportConnector name="mqtt+ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> </transportConnectors>避免配置中存在限制持久订阅的参数。
显式声明订阅的持久化属性
尝试在订阅参数中添加durable标识(部分MQTT实现需显式声明),修改订阅逻辑:function onConnect() { let QOS = 1; client.subscribe("mytopic", { qos: QOS, durable: true }); }指定兼容的MQTT协议版本
ActiveMQ 5.17.1支持MQTT 3.1/3.1.1,在connect配置中显式指定协议版本,避免版本兼容问题:client.connect({ onSuccess: onConnect, cleanSession: false, mqttVersion: 4 // 对应MQTT 3.1.1版本 });查看ActiveMQ日志定位细节
检查data/activemq.log中的MQTT相关日志,确认客户端连接时cleanSession=false标识是否被正确接收,以及订阅请求的处理流程,排查是否存在权限或配置层面的隐性限制。
内容的提问来源于stack exchange,提问作者djna

