package com.wgcloud.util.msg; import com.wgcloud.common.ApplicationContextHelper; import com.wgcloud.config.CommonConfig; import com.wgcloud.config.MailConfig; import net.jodah.expiringmap.ExpirationPolicy; import net.jodah.expiringmap.ExpiringMap; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.TimeUnit; /** * @version v3.3 * @ClassName:WarnPools.java * @author: http://www.wgstart.com * @date: 2021年1月16日 * @Description: WarnPools.java * @Copyright: 2019-2021 wgcloud. All rights reserved. */ public class WarnPools { private static final Logger logger = LoggerFactory.getLogger(WarnPools.class); private static CommonConfig commonConfig = (CommonConfig) ApplicationContextHelper.getBean(CommonConfig.class); private static MailConfig mailConfig = (MailConfig) ApplicationContextHelper.getBean(MailConfig.class); /** * 缓存每次发送的告警信息map */ public static ExpiringMap MEM_WARN_MAP = null; // 告警信息计数器,提供给页面告警声音提示用,不存库 public static List WARN_COUNT_LIST = Collections.synchronizedList(new ArrayList()); //该map存贮服务接口一定时间内的告警次数 public static ExpiringMap HEATH_WARN_COUNT_MAP = null; //该map存贮PING设备一定时间内的告警次数 public static ExpiringMap PING_WARN_COUNT_MAP = null; /** * 每天定时清空告警缓存map */ public static void clearOldData() { logger.info("清空告警缓存map"); if (null != MEM_WARN_MAP) { MEM_WARN_MAP.clear(); } logger.info("清空告警信息计数器"); WARN_COUNT_LIST.clear(); //清空服务接口,PING告警次数缓存记录 logger.info("清空服务接口,PING告警失败次数的缓存记录"); if (null != HEATH_WARN_COUNT_MAP) { HEATH_WARN_COUNT_MAP.clear(); } if (null != PING_WARN_COUNT_MAP) { PING_WARN_COUNT_MAP.clear(); } } /** * 判断告警通知是否在缓存里 * 在缓存返回true,不在缓存返回false * * @param key 缓存key * @param warnCacheTimes 设定的缓存时间,秒 * @return */ public static boolean isExpireWarnTime(String key, Integer warnCacheTimes) { if (StringUtils.isEmpty(key)) { return false; } if (null == warnCacheTimes) { warnCacheTimes = 7200; } try { if (null == MEM_WARN_MAP) { /** *expiration(5000,TimeUnit.MILLISECONDS) *设置过期时间为5秒 *ExpirationPolicy.CREATED) *设置过期策略为创建或更新值后 */ MEM_WARN_MAP = ExpiringMap.builder().expiration(warnCacheTimes, TimeUnit.SECONDS) .expirationPolicy(ExpirationPolicy.CREATED) .build(); } if (null != MEM_WARN_MAP.get(key)) { //这条告警仍然在告警缓存,没有过期 return true; } } catch (Exception e) { logger.error("判断告警缓存时间错误", e); } return false; } /** * 初始化服务接口告警map,ping设备告警map * 连续失败多少次再发送告警通知 */ public static void initWarnCountMap() { try { if (null == WarnPools.HEATH_WARN_COUNT_MAP) { long heathOutTimes = commonConfig.getHeathTimes() * mailConfig.getHeathWarnCount(); //额外多保留10s缓冲 heathOutTimes = heathOutTimes + 10; /** *expiration(5000,TimeUnit.MILLISECONDS) *设置过期时间为5秒 *ExpirationPolicy.CREATED) *设置过期策略为创建或更新值后 */ WarnPools.HEATH_WARN_COUNT_MAP = ExpiringMap.builder().expiration(heathOutTimes, TimeUnit.SECONDS) .expirationPolicy(ExpirationPolicy.CREATED) .build(); } if (null == WarnPools.PING_WARN_COUNT_MAP) { long pingOutTimes = commonConfig.getDceTimes() * mailConfig.getDceWarnCount(); //额外多保留10s pingOutTimes = pingOutTimes + 10; /** *expiration(5000,TimeUnit.MILLISECONDS) *设置过期时间为5秒 *ExpirationPolicy.CREATED) *设置过期策略为创建或更新值后 */ WarnPools.PING_WARN_COUNT_MAP = ExpiringMap.builder().expiration(pingOutTimes, TimeUnit.SECONDS) .expirationPolicy(ExpirationPolicy.CREATED) .build(); } } catch (Exception e) { logger.error("判断告警缓存时间错误", e); } } }