|
@@ -0,0 +1,319 @@
|
|
|
+package com.persagy.cache;
|
|
|
+
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.fasterxml.jackson.databind.JsonNode;
|
|
|
+import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
+import com.fasterxml.jackson.databind.node.ObjectNode;
|
|
|
+import com.persagy.entity.AlarmLastTime;
|
|
|
+import com.persagy.entity.ZktAlarmRecordDO;
|
|
|
+import com.persagy.enumeration.YesNoEnum;
|
|
|
+import com.persagy.repository.AlarmLastTimeRepository;
|
|
|
+import com.persagy.repository.AlarmRecordRepository;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Set;
|
|
|
+import java.util.concurrent.ConcurrentHashMap;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @description: 存放云端返回的报警id, 当报警恢复或过期后移除报警id
|
|
|
+ * @author: lixing
|
|
|
+ * @company: Persagy Technology Co.,Ltd
|
|
|
+ * @since: 2021/1/21 下午8:28
|
|
|
+ * @version: V1.0
|
|
|
+ */
|
|
|
+@Component
|
|
|
+@Slf4j
|
|
|
+public class AlarmLastTimeCache {
|
|
|
+ @Autowired
|
|
|
+ private AlarmLastTimeRepository alarmLastTimeRepository;
|
|
|
+ @Autowired
|
|
|
+ private AlarmRecordRepository alarmRecordRepository;
|
|
|
+ /**
|
|
|
+ * 报警id - AlarmLastTime对象
|
|
|
+ */
|
|
|
+ private final ConcurrentHashMap<String, AlarmLastTime> alarmLastTimeMap = new ConcurrentHashMap<>();
|
|
|
+ /**
|
|
|
+ * 报警定义id - 报警id
|
|
|
+ */
|
|
|
+ private final ConcurrentHashMap<String, String> defineAlarmMap = new ConcurrentHashMap<>();
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description: 初始化方法,查询数据库中的数据,放入set
|
|
|
+ * @param:
|
|
|
+ * @return:
|
|
|
+ * @exception:
|
|
|
+ * @author: lixing
|
|
|
+ * @company: Persagy Technology Co.,Ltd
|
|
|
+ * @since: 2021/1/21 下午8:43
|
|
|
+ * @version: V1.0
|
|
|
+ */
|
|
|
+ public void init() {
|
|
|
+ // 初始化alarmLastTimeMap
|
|
|
+ Iterable<AlarmLastTime> alarmLastTimes = alarmLastTimeRepository.findAll();
|
|
|
+ // alarmLastTimes 不会为空
|
|
|
+ alarmLastTimes.forEach(alarmLastTime -> alarmLastTimeMap.put(alarmLastTime.getId(), alarmLastTime));
|
|
|
+ log.info("alarmLastTimeMap初始化完成");
|
|
|
+ log.info("当前alarmLastTimeMap为:[{}]", alarmLastTimeMapToString(alarmLastTimeMap));
|
|
|
+
|
|
|
+ // 初始化defineAlarmMap
|
|
|
+ Iterable<ZktAlarmRecordDO> alarmRecords = alarmRecordRepository.findAll();
|
|
|
+ // alarmRecords 不会为空
|
|
|
+ alarmRecords.forEach(alarmRecord -> defineAlarmMap.put(alarmRecord.getDefinitionId(), alarmRecord.getAlarmId()));
|
|
|
+ log.info("defineAlarmMap初始化完成");
|
|
|
+ log.info("当前defineAlarmMap为:[{}]", defineAlarmMap.toString());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description: 将报警id放入缓存
|
|
|
+ * @param: alarmId
|
|
|
+ * @return: void
|
|
|
+ * @exception:
|
|
|
+ * @author: lixing
|
|
|
+ * @company: Persagy Technology Co.,Ltd
|
|
|
+ * @since: 2021/1/21 下午8:44
|
|
|
+ * @version: V1.0
|
|
|
+ */
|
|
|
+ public void put(String alarmId, Integer lastTime) {
|
|
|
+ AlarmLastTime preAlarmLastTime = alarmLastTimeMap.get(alarmId);
|
|
|
+ // 没有存储过该报警id的持续时间或者本次报警持续时长大于上次的报警持续时长时,更新缓存
|
|
|
+ boolean updateCache = false;
|
|
|
+ YesNoEnum alarmHasCreated = YesNoEnum.NO;
|
|
|
+ if (preAlarmLastTime == null) {
|
|
|
+ updateCache = true;
|
|
|
+ } else {
|
|
|
+ Integer preLastTime = preAlarmLastTime.getLastTime();
|
|
|
+ alarmHasCreated = preAlarmLastTime.getAlarmHasCreated();
|
|
|
+ if (preLastTime == null || lastTime > preLastTime) {
|
|
|
+ updateCache = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (updateCache) {
|
|
|
+ AlarmLastTime alarmLastTime = new AlarmLastTime();
|
|
|
+ alarmLastTime.setId(alarmId);
|
|
|
+ alarmLastTime.setLastTime(lastTime);
|
|
|
+ alarmLastTime.setHasSent(YesNoEnum.NO);
|
|
|
+ alarmLastTime.setAlarmHasCreated(alarmHasCreated);
|
|
|
+ // 存入缓存
|
|
|
+ alarmLastTimeMap.put(alarmId, alarmLastTime);
|
|
|
+ // 持久化到数据库
|
|
|
+ alarmLastTimeRepository.save(alarmLastTime);
|
|
|
+ log.info("[{}-{}]放入alarmLastTimeMap", alarmId, lastTime);
|
|
|
+ log.info("当前alarmLastTimeMap缓存为:[{}]", alarmLastTimeMapToString(alarmLastTimeMap));
|
|
|
+ } else {
|
|
|
+ log.info("经判断无需更新alarmLastTimeCache, 报警id - 报警持续时间:[{}-{}]", alarmId, lastTime);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description: 更新报警持续时间是否发送的状态
|
|
|
+ * @param: alarmId
|
|
|
+ * @param: alarmLastTimeHasSentEnum
|
|
|
+ * @return: void
|
|
|
+ * @exception:
|
|
|
+ * @author: lixing
|
|
|
+ * @company: Persagy Technology Co.,Ltd
|
|
|
+ * @since: 2021/2/5 4:23 下午
|
|
|
+ * @version: V1.0
|
|
|
+ */
|
|
|
+ public void updateHasSent(String alarmId, YesNoEnum alarmLastTimeHasSentEnum) {
|
|
|
+ AlarmLastTime alarmLastTime = alarmLastTimeMap.get(alarmId);
|
|
|
+ if (alarmLastTime != null) {
|
|
|
+ alarmLastTime.setHasSent(alarmLastTimeHasSentEnum);
|
|
|
+ // 存入缓存
|
|
|
+ alarmLastTimeMap.put(alarmId, alarmLastTime);
|
|
|
+ // 持久化到数据库
|
|
|
+ alarmLastTimeRepository.save(alarmLastTime);
|
|
|
+ log.info("更新alarmLastTime状态为:[{}-{}]", alarmId, alarmLastTimeHasSentEnum);
|
|
|
+ log.info("当前alarmLastTimeMap缓存为:[{}]", alarmLastTimeMapToString(alarmLastTimeMap));
|
|
|
+ } else {
|
|
|
+ log.info("未找到相应的alarmLastTime, 报警id: [{}]", alarmId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description: 更新报警持续时间为可删除
|
|
|
+ * @param: alarmId
|
|
|
+ * @param: alarmLastTimeHasSentEnum
|
|
|
+ * @return: void
|
|
|
+ * @exception:
|
|
|
+ * @author: lixing
|
|
|
+ * @company: Persagy Technology Co.,Ltd
|
|
|
+ * @since: 2021/2/5 4:23 下午
|
|
|
+ * @version: V1.0
|
|
|
+ */
|
|
|
+ public void setDeleteAvailable(String alarmId) {
|
|
|
+ AlarmLastTime alarmLastTime = alarmLastTimeMap.get(alarmId);
|
|
|
+ if (alarmLastTime != null) {
|
|
|
+ alarmLastTime.setDeleteAvailable(YesNoEnum.YES);
|
|
|
+ // 存入缓存
|
|
|
+ alarmLastTimeMap.put(alarmId, alarmLastTime);
|
|
|
+ // 持久化到数据库
|
|
|
+ alarmLastTimeRepository.save(alarmLastTime);
|
|
|
+ log.info("更新alarmLastTime状态为可删除,报警id:[{}]", alarmId);
|
|
|
+ log.info("当前alarmLastTimeMap缓存为:[{}]", alarmLastTimeMapToString(alarmLastTimeMap));
|
|
|
+ } else {
|
|
|
+ log.info("未找到相应的alarmLastTime, 报警id: [{}]", alarmId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description: 更新报警状态为已创建
|
|
|
+ * @param: alarmId
|
|
|
+ * @param: alarmLastTimeHasSentEnum
|
|
|
+ * @return: void
|
|
|
+ * @exception:
|
|
|
+ * @author: lixing
|
|
|
+ * @company: Persagy Technology Co.,Ltd
|
|
|
+ * @since: 2021/2/5 4:23 下午
|
|
|
+ * @version: V1.0
|
|
|
+ */
|
|
|
+ public void setAlarmHasCreated(String alarmId) {
|
|
|
+ AlarmLastTime alarmLastTime = alarmLastTimeMap.get(alarmId);
|
|
|
+ if (alarmLastTime != null) {
|
|
|
+ alarmLastTime.setAlarmHasCreated(YesNoEnum.YES);
|
|
|
+ // 存入缓存
|
|
|
+ alarmLastTimeMap.put(alarmId, alarmLastTime);
|
|
|
+ // 持久化到数据库
|
|
|
+ alarmLastTimeRepository.save(alarmLastTime);
|
|
|
+ log.info("更新alarmLastTime中报警状态为已创建,报警id:[{}]", alarmId);
|
|
|
+ log.info("当前alarmLastTimeMap缓存为:[{}]", alarmLastTimeMapToString(alarmLastTimeMap));
|
|
|
+ } else {
|
|
|
+ log.info("未找到相应的alarmLastTime, 报警id: [{}]", alarmId);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description: 将报警id从缓存中移除
|
|
|
+ * @param: alarmId
|
|
|
+ * @return: void
|
|
|
+ * @exception:
|
|
|
+ * @author: lixing
|
|
|
+ * @company: Persagy Technology Co.,Ltd
|
|
|
+ * @since: 2021/1/21 下午8:44
|
|
|
+ * @version: V1.0
|
|
|
+ */
|
|
|
+ public void remove(String alarmId) {
|
|
|
+ if (StringUtils.isBlank(alarmId)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 从缓存中移除
|
|
|
+ alarmLastTimeMap.remove(alarmId);
|
|
|
+ // 从数据库中移除
|
|
|
+ alarmLastTimeRepository.deleteById(alarmId);
|
|
|
+ log.info("报警id[{}]从alarmLastTimeMap移除", alarmId);
|
|
|
+ log.info("当前alarmLastTimeMap缓存为:[{}]", alarmLastTimeMapToString(alarmLastTimeMap));
|
|
|
+ }
|
|
|
+
|
|
|
+ public AlarmLastTime get(String alarmId) {
|
|
|
+ return alarmLastTimeMap.get(alarmId);
|
|
|
+ }
|
|
|
+
|
|
|
+ public ConcurrentHashMap<String, AlarmLastTime> getAll() {
|
|
|
+ return alarmLastTimeMap;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description: 根据报警定义获取报警id
|
|
|
+ * @param: defineId
|
|
|
+ * @return: java.lang.String
|
|
|
+ * @exception:
|
|
|
+ * @author: lixing
|
|
|
+ * @company: Persagy Technology Co.,Ltd
|
|
|
+ * @since: 2021/2/5 4:41 下午
|
|
|
+ * @version: V1.0
|
|
|
+ */
|
|
|
+ public String getAlarmId(String defineId) {
|
|
|
+ return defineAlarmMap.get(defineId);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description: 更新报警定义对应的报警id
|
|
|
+ * @param: defineId
|
|
|
+ * @return: java.lang.String
|
|
|
+ * @exception:
|
|
|
+ * @author: lixing
|
|
|
+ * @company: Persagy Technology Co.,Ltd
|
|
|
+ * @since: 2021/2/5 4:41 下午
|
|
|
+ * @version: V1.0
|
|
|
+ */
|
|
|
+ public void updateAlarmId(String defineId, String alarmId) {
|
|
|
+ defineAlarmMap.put(defineId, alarmId);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description: 将alarmLastTimeMap转换为字符串
|
|
|
+ * @param: map
|
|
|
+ * @return: java.lang.String
|
|
|
+ * @exception:
|
|
|
+ * @author: lixing
|
|
|
+ * @company: Persagy Technology Co.,Ltd
|
|
|
+ * @since: 2021/2/5 4:19 下午
|
|
|
+ * @version: V1.0
|
|
|
+ */
|
|
|
+ public String alarmLastTimeMapToString(ConcurrentHashMap<String, AlarmLastTime> map) {
|
|
|
+ if (map == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ StringBuilder stringBuilder = new StringBuilder();
|
|
|
+ String[] ignoreParams = {"alarmLastMsg", "projectId"};
|
|
|
+ List<String> ignoreParamList = Arrays.asList(ignoreParams);
|
|
|
+ for (String key : map.keySet()) {
|
|
|
+ if (ignoreParamList.contains(key)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ stringBuilder.append(key).
|
|
|
+ append("=").
|
|
|
+ append(map.get(key).toString()).
|
|
|
+ append("\n");
|
|
|
+ }
|
|
|
+ return stringBuilder.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void main(String[] args) {
|
|
|
+ ConcurrentHashMap<String, AlarmLastTime> testMap = new ConcurrentHashMap<>();
|
|
|
+ AlarmLastTime alarmLastTime = new AlarmLastTime();
|
|
|
+ alarmLastTime.setId("1");
|
|
|
+ alarmLastTime.setLastTime(1);
|
|
|
+ alarmLastTime.setHasSent(YesNoEnum.NO);
|
|
|
+ testMap.put("1", alarmLastTime);
|
|
|
+ AlarmLastTime alarmLastTime1 = new AlarmLastTime();
|
|
|
+ alarmLastTime1.setId("1");
|
|
|
+ alarmLastTime1.setLastTime(1);
|
|
|
+ alarmLastTime1.setHasSent(YesNoEnum.YES);
|
|
|
+ testMap.put("2", alarmLastTime1);
|
|
|
+ AlarmLastTimeCache alarmLastTimeCache = new AlarmLastTimeCache();
|
|
|
+ System.out.println(alarmLastTimeCache.alarmLastTimeMapToString(testMap));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description: 设置报警持续消息
|
|
|
+ * @param: alarmId 报警id
|
|
|
+ * @param: jsonObject 报警消息
|
|
|
+ * @return: void
|
|
|
+ * @exception:
|
|
|
+ * @author: lixing
|
|
|
+ * @company: Persagy Technology Co.,Ltd
|
|
|
+ * @since: 2021/2/6 9:48 上午
|
|
|
+ * @version: V1.0
|
|
|
+ */
|
|
|
+ public void setAlarmLastMsg(String alarmId, ObjectNode alarmLastMsg) {
|
|
|
+ AlarmLastTime alarmLastTime = alarmLastTimeMap.get(alarmId);
|
|
|
+ if (alarmLastTime != null) {
|
|
|
+ alarmLastTime.setAlarmLastMsg(alarmLastMsg);
|
|
|
+ // 存入缓存
|
|
|
+ alarmLastTimeMap.put(alarmId, alarmLastTime);
|
|
|
+ // 持久化到数据库
|
|
|
+ alarmLastTimeRepository.save(alarmLastTime);
|
|
|
+ log.info("完成报警持续消息的初始化,报警id:[{}]", alarmId);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+}
|