付延余
2022-12-16 f0f8ee8c4a945adbc742d9bab69382b28ad311fb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
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<key,1>
     */
    public static ExpiringMap<String, String> MEM_WARN_MAP = null;
 
    // 告警信息计数器,提供给页面告警声音提示用,不存库
    public static List<Integer> WARN_COUNT_LIST = Collections.synchronizedList(new ArrayList<Integer>());
 
    //该map存贮服务接口一定时间内的告警次数
    public static ExpiringMap<String, Integer> HEATH_WARN_COUNT_MAP = null;
 
    //该map存贮PING设备一定时间内的告警次数
    public static ExpiringMap<String, Integer> 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);
        }
    }
 
}