SpringBoot知识体系(六)——监控与邮件提醒

  • Post author:
  • Post category:其他




简述

利用

spring

框架中的任务注解

@Scheduled

定时执行任务,监控某个服务,并把其状态通过邮件发送给管理员。

发邮件使用

springboot



JavaMailSender

类。这是一个很通用的工具接口,在

springboot

中只需要引入一个

maven

依赖,无需任何配置就可以从容地进行开发工作,简单快捷高效。



以监控Elasticsearch集群的健康状态为例:



添加maven依赖

确保先增加过

springboot

依赖之后,再增加以下依赖

        <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.2</version>
        </dependency>
        <!--mail-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>



增加application.properties

需要替换为自己邮箱协议与密码,发送方必须要开启smtp。我这里使用的QQ邮箱,设置方法见

QQ邮件开启smtp服务

# mail 
spring.mail.host=smtp.qq.com
spring.mail.username=1234567835@qq.com
spring.mail.password=lassssssyxvudibh
spring.mail.properties.mail.stmp.auth=true

注意:在spring.mail.password处的值是需要在邮箱设置里面生成的授权码,这个不是真实的密码。



增加监控类

其中

HEALTH_CHECK_API

可替换为自己的服务监控接口

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component
public class ESMonitor {

    private static final String HEALTH_CHECK_API = "http://192.138.131.12:9200/_cluster/health";

    private static final String GREEN = "green";
    private static final String YELLOW = "yellow";
    private static final String RED = "red";

    @Autowired
    private ObjectMapper objectMapper;

    @Autowired
    private JavaMailSender mailSender;

    @Scheduled(fixedDelay=5000)
    public void healthCheck(){
        HttpClient httpClient = HttpClients.createDefault();

        HttpGet get = new HttpGet(HEALTH_CHECK_API);

        try {
            HttpResponse response = httpClient.execute(get);
            if(response.getStatusLine().getStatusCode()!=HttpServletResponse.SC_OK){
                System.out.println("Can not access ES Service normally! Please check the server.");
            }else {
                String body = EntityUtils.toString(response.getEntity(),"UTF-8");
                JsonNode jsonNode =  objectMapper.readTree(body);
                String status = jsonNode.get("status").asText();
                String msg = "";
                boolean isNormally = false;
                switch (status){
                    case GREEN:
                        msg ="ES server run normally.";
                        isNormally = true;
                        break;
                    case YELLOW:
                        msg ="ES server gets status yellow!";
                        break;
                    case RED:
                        msg ="ES server gets status red!";
                        break;
                    default:
                        msg ="Unknow ES server status:"+status ;
                        break;
                }
                if(!isNormally){
                    sendAlertMessage(msg);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    private void sendAlertMessage(String message){
        SimpleMailMessage mailMessage = new SimpleMailMessage();
        mailMessage.setFrom("1234567835@qq.com");
        mailMessage.setTo("1234567835@qq.com");
        mailMessage.setSubject("【警告】ES服务监控");
        mailMessage.setText(message);

        mailSender.send(mailMessage);
    }

}

这样就可以简单的监控服务是否健康了。



尾巴

其中@Scheduled注解的参数解释:

  1. cron

    语法@Scheduled(cron=“1 * * * * * *”)

    表达式:[秒] [分] [小时] [日] [月] [周] [年]

    其中年可以省略
  2. zone

    时区,接收一个java.util.TimeZone#ID。cron表达式会基于该时区解析。默认是一个空字符串,即取服务器所在地的时区
  3. fixedDelay

    上一次执行完毕时间点之后多长时间再执行。
  4. fixedDelayString

    与 3. fixedDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符

    @Scheduled(fixedDelayString = “${time.fixedDelay}”)

    占位符的使用(配置文件中有配置:time.fixedDelay=5000)
  5. fixedRate

    上一次开始执行时间点之后多长时间再执行。
  6. fixedRateString

    与 5. fixedRate 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。
  7. initialDelay

    第一次延迟多长时间后再执行。

    @Scheduled(initialDelay=1000, fixedRate=5000)
  8. initialDelayString

    与 7. initialDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。



参考


@Scheduled注解各参数详解


在线Cron表达式网站



版权声明:本文为qq_37338761原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。