简述
利用
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注解的参数解释:
-
cron
语法@Scheduled(cron=“1 * * * * * *”)
表达式:[秒] [分] [小时] [日] [月] [周] [年]
其中年可以省略 -
zone
时区,接收一个java.util.TimeZone#ID。cron表达式会基于该时区解析。默认是一个空字符串,即取服务器所在地的时区 -
fixedDelay
上一次执行完毕时间点之后多长时间再执行。 -
fixedDelayString
与 3. fixedDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符
@Scheduled(fixedDelayString = “${time.fixedDelay}”)
占位符的使用(配置文件中有配置:time.fixedDelay=5000) -
fixedRate
上一次开始执行时间点之后多长时间再执行。 -
fixedRateString
与 5. fixedRate 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。 -
initialDelay
第一次延迟多长时间后再执行。
@Scheduled(initialDelay=1000, fixedRate=5000) -
initialDelayString
与 7. initialDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。
参考
版权声明:本文为qq_37338761原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。