topic设备数据消息5次没有数据内容则增加告警,告警等级修改为“一般”,读到数据后自恢复
This commit is contained in:
@ -85,6 +85,8 @@ public interface IEmsAlarmRecordsService
|
|||||||
// topic 内没有数据,按照设备维度告警
|
// topic 内没有数据,按照设备维度告警
|
||||||
public void addEmptyDataAlarmRecord(String siteId, String deviceId);
|
public void addEmptyDataAlarmRecord(String siteId, String deviceId);
|
||||||
|
|
||||||
|
public void deleteEmptyDataAlarmRecord(String siteId, String deviceId);
|
||||||
|
|
||||||
// 告警字段和告警信息
|
// 告警字段和告警信息
|
||||||
public void initAlarmMatchInfo();
|
public void initAlarmMatchInfo();
|
||||||
|
|
||||||
|
|||||||
@ -72,6 +72,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@ -91,6 +92,7 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i
|
|||||||
private static final Pattern PATTERN = Pattern.compile("(BMSD\\d{2})(ZT|SOC|SOH|DL|DY|BDSC)");
|
private static final Pattern PATTERN = Pattern.compile("(BMSD\\d{2})(ZT|SOC|SOH|DL|DY|BDSC)");
|
||||||
// 匹配DTDC+数字格式的正则(提取序号)
|
// 匹配DTDC+数字格式的正则(提取序号)
|
||||||
private static final Pattern DTDC_PATTERN = Pattern.compile("DTDC(\\d+)([A-Za-z]*)");
|
private static final Pattern DTDC_PATTERN = Pattern.compile("DTDC(\\d+)([A-Za-z]*)");
|
||||||
|
private final Map<String, Integer> topicEmptyCounts = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private EmsBatteryClusterMapper emsBatteryClusterMapper;
|
private EmsBatteryClusterMapper emsBatteryClusterMapper;
|
||||||
@ -166,12 +168,27 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i
|
|||||||
Date dataUpdateTime = DateUtils.convertUpdateTime(timestamp);
|
Date dataUpdateTime = DateUtils.convertUpdateTime(timestamp);
|
||||||
|
|
||||||
log.info("deviceId:" + deviceId);
|
log.info("deviceId:" + deviceId);
|
||||||
|
String deviceNumber = siteId + deviceId;
|
||||||
boolean isEmpty = checkJsonDataEmpty(jsonData);
|
boolean isEmpty = checkJsonDataEmpty(jsonData);
|
||||||
if (isEmpty) {
|
if (isEmpty) {
|
||||||
// 添加设备告警
|
// 增加失败计数
|
||||||
iEmsAlarmRecordsService.addEmptyDataAlarmRecord(siteId, deviceId);
|
int failureCount = topicEmptyCounts.getOrDefault(deviceNumber, 0) + 1;
|
||||||
|
topicEmptyCounts.put(deviceNumber, failureCount);
|
||||||
|
|
||||||
|
log.warn("设备 {} topic内没有数据,当前连续次数: {}", deviceId, failureCount);
|
||||||
|
|
||||||
|
// 连续5次失败触发报警
|
||||||
|
if (failureCount >= 5) {
|
||||||
|
// 添加设备告警
|
||||||
|
iEmsAlarmRecordsService.addEmptyDataAlarmRecord(siteId, deviceId);
|
||||||
|
log.error("设备 {} 连续 {} 次topic内没有数据,触发告警", deviceNumber, failureCount);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// 数据读取成功,重置计数器
|
||||||
|
topicEmptyCounts.remove(deviceNumber);
|
||||||
|
// 读取到数据后告警自恢复
|
||||||
|
iEmsAlarmRecordsService.deleteEmptyDataAlarmRecord(siteId, deviceId);
|
||||||
|
|
||||||
// 存放mqtt原始每个设备最晚一次数据,便于后面点位获取数据
|
// 存放mqtt原始每个设备最晚一次数据,便于后面点位获取数据
|
||||||
redisCache.setCacheObject(RedisKeyConstants.ORIGINAL_MQTT_DATA + siteId + "_" + deviceId, obj);
|
redisCache.setCacheObject(RedisKeyConstants.ORIGINAL_MQTT_DATA + siteId + "_" + deviceId, obj);
|
||||||
@ -1891,12 +1908,12 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i
|
|||||||
boolean flag = false;
|
boolean flag = false;
|
||||||
try {
|
try {
|
||||||
if (StringUtils.isEmpty(jsonData)) {
|
if (StringUtils.isEmpty(jsonData)) {
|
||||||
flag = true;
|
return true;
|
||||||
}
|
}
|
||||||
JsonNode jsonNode = objectMapper.readTree(jsonData);
|
JsonNode jsonNode = objectMapper.readTree(jsonData);
|
||||||
// 判断是否为空对象({})
|
// 判断是否为空对象({})
|
||||||
if (jsonNode.isObject() && jsonNode.isEmpty()) {
|
if (jsonNode.isObject() && jsonNode.isEmpty()) {
|
||||||
flag = true;
|
return true;
|
||||||
}
|
}
|
||||||
} catch (JsonProcessingException e) {
|
} catch (JsonProcessingException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
|
|||||||
@ -231,7 +231,7 @@ public class EmsAlarmRecordsServiceImpl implements IEmsAlarmRecordsService
|
|||||||
if (emsAlarmRecords != null) {
|
if (emsAlarmRecords != null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
emsAlarmRecords = createAlarmAtPcs(siteId,topicDevice,"topic内没有数据",AlarmLevelStatus.EMERGENCY.getCode());
|
emsAlarmRecords = createAlarmAtPcs(siteId,topicDevice,"topic内没有数据",AlarmLevelStatus.GENERAL.getCode());
|
||||||
emsAlarmRecordsMapper.insertEmsAlarmRecords(emsAlarmRecords);
|
emsAlarmRecordsMapper.insertEmsAlarmRecords(emsAlarmRecords);
|
||||||
|
|
||||||
// 存redis-防止重复插入-有效期一天
|
// 存redis-防止重复插入-有效期一天
|
||||||
@ -252,6 +252,21 @@ public class EmsAlarmRecordsServiceImpl implements IEmsAlarmRecordsService
|
|||||||
return emsAlarmRecords;
|
return emsAlarmRecords;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deleteEmptyDataAlarmRecord(String siteId, String topicDevice) {
|
||||||
|
String key = RedisKeyConstants.TOPIC_EMPTY_ALARM_RECORD + siteId + "_" + topicDevice;
|
||||||
|
EmsAlarmRecords emsAlarmRecords = redisCache.getCacheObject(key);
|
||||||
|
if (emsAlarmRecords == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
emsAlarmRecords.setStatus(AlarmStatus.DONE.getCode());
|
||||||
|
emsAlarmRecords.setUpdateTime(new Date());
|
||||||
|
emsAlarmRecords.setAlarmEndTime(new Date());
|
||||||
|
emsAlarmRecordsMapper.updateEmsAlarmRecords(emsAlarmRecords);
|
||||||
|
|
||||||
|
redisCache.deleteObject(key);
|
||||||
|
}
|
||||||
|
|
||||||
private String createRandomTicketNo() {
|
private String createRandomTicketNo() {
|
||||||
String ticketNo = "";
|
String ticketNo = "";
|
||||||
String nowDate = DateUtils.dateTime();
|
String nowDate = DateUtils.dateTime();
|
||||||
|
|||||||
Reference in New Issue
Block a user