fix: 溶解氧探头离线告警修复。
This commit is contained in:
@@ -109,4 +109,50 @@ public class DeviceOfflineWarnTask {
|
||||
log.error("[离线告警] 扫描离线标记异常: {}", e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 每分钟扫描一次溶解氧探头离线等待标记
|
||||
* 对超过配置的延迟时长的设备触发探头离线告警
|
||||
* Redis value 格式:{offlineTime}(yyyy-MM-dd HH:mm:ss)
|
||||
*/
|
||||
@Scheduled(fixedDelay = 60000)
|
||||
public void checkDetectorOxyOfflineWaitAndTrigger() {
|
||||
try {
|
||||
Collection<String> keys = RedisUtils.keys(DeviceDataHandler.DETECTOR_OXY_OFFLINE_WAIT_KEY_PREFIX + "*");
|
||||
if (keys == null || keys.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
int delayMinutes = aliyunIotProperties.getOfflineWarnDelayMinutes();
|
||||
|
||||
for (String key : keys) {
|
||||
try {
|
||||
String offlineTimeStr = RedisUtils.getCacheObject(key);
|
||||
if (offlineTimeStr == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
LocalDateTime offlineTime = LocalDateTime.parse(offlineTimeStr, FORMATTER);
|
||||
long elapsedMinutes = java.time.Duration.between(offlineTime, now).toMinutes();
|
||||
|
||||
if (elapsedMinutes >= delayMinutes) {
|
||||
// 提取 deviceName(去掉前缀)
|
||||
String deviceName = key.substring(DeviceDataHandler.DETECTOR_OXY_OFFLINE_WAIT_KEY_PREFIX.length());
|
||||
|
||||
// 触发告警前先删除标记,防止重复触发
|
||||
RedisUtils.deleteObject(key);
|
||||
|
||||
log.info("[探头离线告警] 溶解氧探头离线已超过 {} 分钟(阈值{}分钟),触发告警: {}", elapsedMinutes, delayMinutes, deviceName);
|
||||
|
||||
deviceDataHandler.triggerDetectorOxyOfflineAlarm(deviceName);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("[探头离线告警] 处理单条探头离线标记异常,key={}: {}", key, e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("[探头离线告警] 扫描探头离线标记异常: {}", e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user