Files
water/.workbuddy/memory/2026-06-12.md

1.2 KiB
Raw Permalink Blame History

2026-06-12 工作日志

15. 修复设备断电后数据库状态未更新为离线

问题:设备断电/断网后Redis 中的在线 Keymqtt:device:status:{deviceNo})会在 TTL默认 300s到期后自动消失但数据库 app_device.status 字段没有同步更新,始终显示在线。

方案:三层联动

  1. 定时任务扫库(新增 DeviceOfflineCheckTask:每 90s 扫描 DB 中 status=1 的设备,检查 Redis Key 是否存在,不存在则批量更新 status=0(离线)。扫描间隔可通过 mqtt.offline-check.interval-ms 配置项覆盖。

  2. 上线时同步写库

    • DeviceDataHandler.handle():收到电量上报时,AppDeviceBo.setStatus("1") 写库 + 刷新 Redis Key
    • DeviceRegisterHandler.buildRegisterDevice():注册时 device.setStatus("1")
  3. 修复注册默认状态registerByMqtt() 中注册默认值从 status=2 改为 status=1(在线)

状态值定义(来自 AppDeviceBo 注释):

  • 0:离线
  • 1:在线
  • 2:到期
  • 3:故障

新增文件water-app/src/main/java/org/dromara/app/task/DeviceOfflineCheckTask.java