简介
InetAddress是JDK提供用于网络编程的类,通过使用InetAddress类相关的方法实现测试网络连通性。
背景
因客户网络经常出现间歇中断,无法准确定位,为帮助其定位问题,使用定时任务去测试客户ip,并在无法连通时发送告警邮件,网络重新恢复后发送提醒邮件(邮件发送使用spring官方依赖)。
使用
1、方法解析
方法 | 功能 |
---|---|
InetAddress getByName(String host) | 获取给定主机名的的IP地址,host参数表示指定主机IP或域名 |
boolean isReachable(int timeout) | 判断在指定时间内指定的IP地址是否可以访问,可以访问返回true;否则返回false |
2、代码示例
/**
* 定时任务
*/
@Component
@Slf4j
public class ScheduledTask {
// 默认ping失败次数为0,用作发送邮件
private static Integer pingFailureCount = 0;
// IP
private static final String ip = "x.x.x.x";
// ping超时时间 单位毫秒
private static final Integer pingTimeOut = 5000;
/**
* 定时任务(每分钟执行一次):ping网络连通性
*/
@Scheduled(cron = "0 * * * * ?")
public void timingPing() {
try {
// ping指定公网ip
boolean status = InetAddress.getByName(ip).isReachable(pingTimeOut);
// ping失败
if (!status) {
// ping失败次数模50等于0,进行邮件告警
if (pingFailureCount % 50 == 0) {
log.error("网络异常:IP:" + ip + " 网络异常。");
}
// ping失败次数加1
pingFailureCount ++;
} else {
// ping失败次数大于0,进行邮件提醒
if (pingFailureCount > 0) {
log.error("网络恢复:IP:" + ip + " 网络已恢复。");
}
// ping成功,ping失败次数置0
pingFailureCount = 0;
}
log.info("定时任务--ping失败次数:{}", JSON.toJSONString(pingFailureCount));
log.info("定时任务--ping网络连通性,IP:" + ip + " 结果:{}", JSON.toJSONString(status));
} catch (Exception e) {
log.error("定时任务--ping网络连通性,IP:" + ip + " 异常:{}\n{}", e.getMessage(), e);
}
}
}