You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ActiveMQ中Paho.MQTT JavaScript客户端持久订阅创建失败求助

技术求助:Paho JS客户端无法创建ActiveMQ持久化订阅

环境信息

  • 系统: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已被授予。


技术建议

  1. 确保客户端ID的唯一性与绑定关系
    持久订阅与客户端ID强绑定,检查JS客户端使用的DAVID是否被其他非持久订阅占用,建议测试时复用命令行中有效的DAVE作为客户端ID,验证是否能触发持久化。

  2. 检查ActiveMQ的WebSocket连接器配置
    确认activemq.xml中的MQTT WebSocket连接器未禁用持久化支持,示例配置如下:

    <transportConnectors>
        <transportConnector name="mqtt+ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    </transportConnectors>
    

    避免配置中存在限制持久订阅的参数。

  3. 显式声明订阅的持久化属性
    尝试在订阅参数中添加durable标识(部分MQTT实现需显式声明),修改订阅逻辑:

    function onConnect() {
        let QOS = 1;
        client.subscribe("mytopic", { 
            qos: QOS,
            durable: true
        });
    }
    
  4. 指定兼容的MQTT协议版本
    ActiveMQ 5.17.1支持MQTT 3.1/3.1.1,在connect配置中显式指定协议版本,避免版本兼容问题:

    client.connect({
        onSuccess: onConnect,
        cleanSession: false,
        mqttVersion: 4 // 对应MQTT 3.1.1版本
    });
    
  5. 查看ActiveMQ日志定位细节
    检查data/activemq.log中的MQTT相关日志,确认客户端连接时cleanSession=false标识是否被正确接收,以及订阅请求的处理流程,排查是否存在权限或配置层面的隐性限制。


内容的提问来源于stack exchange,提问作者djna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 19:57:29