美文网首页
告警模块代码的设计思路

告警模块代码的设计思路

作者: 天草二十六_简村人 | 来源:发表于2020-05-07 14:05 被阅读0次

一、目标
告警的方式支持邮件、短信等多种。
当满足告警条件时,遍历所有的告警实现。

二、设计思路


接口和类图.png

定义一个接口,多个实现类。
一个组合类,逐个遍历告警的实现者。

三、JobAlarmer类 的代码实现
实现接口ApplicationContextAware的方法setApplicationContext(),得到告警接口的所有实现类applicationContext.getBeansOfType(JobAlarm.class)。

并且实现接口InitializingBean的方法afterPropertiesSet() ,将所有的告警实现类放在容器List<JobAlarm>中,触发告警的时候,遍历该容器即可。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Component
public class JobAlarmer implements ApplicationContextAware, InitializingBean {
    private static Logger logger = LoggerFactory.getLogger(JobAlarmer.class);

    private ApplicationContext applicationContext;
    private List<JobAlarm> jobAlarmList;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        Map<String, JobAlarm> serviceBeanMap = applicationContext.getBeansOfType(JobAlarm.class);
        if (serviceBeanMap != null && serviceBeanMap.size() > 0) {
            jobAlarmList = new ArrayList<JobAlarm>(serviceBeanMap.values());
        }
    }

    /**
     * job alarm
     *
     * @param param
     * @return
     */
    public boolean alarm(String param) {

        boolean result = false;
        if (jobAlarmList!=null && jobAlarmList.size()>0) {
            result = true;  // success means all-success
            for (JobAlarm alarm: jobAlarmList) {
                boolean resultItem = false;
                try {
                    resultItem = alarm.doAlarm(param);
                } catch (Exception e) {
                    logger.error(e.getMessage(), e);
                }
                if (!resultItem) {
                    result = false;
                }
            }
        }

        return result;
    }

}

相关文章

网友评论

      本文标题:告警模块代码的设计思路

      本文链接:https://www.haomeiwen.com/subject/apxaghtx.html