MqttException 修复说明日期:2026-07-15
设备在 CustomMqttService 创建时多次写入 Mqtt 创建客户端异常:MqttException。设备日志确认该异常至少在 2026-07-03、2026-07-10、2026-07-14 和 2026-07-15 出现;2026-07-15 09:48 服务因应用进程重建而再次创建时连续复现两次。
异常发生在 new MqttAsyncClient(serverUri, clientID),尚未执行 connect()。服务未销毁时,重复调用 startService() 不会再次调用 onCreate(),因此不会重新触发异常。
Paho 的双参数 MqttAsyncClient 构造方法默认创建 MqttDefaultFilePersistence,并在构造阶段调用其 open()。该默认文件持久化依赖 Java 运行目录;在 Android 进程环境中该目录不可作为应用可写的持久化目录,导致构造阶段抛出 MqttException。
当前服务设置了 cleanSession=true,业务仅订阅云端排菜消息,不要求保留客户端侧未完成消息,因此不需要文件持久化。
MqttAsyncClient mqttAsyncClient = new MqttAsyncClient(serverUri, clientID, new MemoryPersistence());
显式使用 MemoryPersistence,避免默认文件持久化目录;异常日志同时记录 reasonCode 与异常详情,方便区分后续问题。
cleanSession=true 下客户端会话状态本就不保留。本次不调整阿里云 MQTT 凭证、服务端策略、主题订阅或消息处理。异步建连失败回调的业务告警增强不属于本次构造阶段故障修复范围。