package com.ycl.utils;
|
|
import com.ycl.platform.domain.result.SYS.TMonitorResult;
|
import com.ycl.utils.http.SelfHttpUtil;
|
import constant.RedisConstant;
|
import lombok.RequiredArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.http.*;
|
import org.springframework.lang.Nullable;
|
import org.springframework.stereotype.Component;
|
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.MultiValueMap;
|
import org.springframework.web.client.RestTemplate;
|
|
import java.io.IOException;
|
import java.net.InetAddress;
|
import java.util.HashMap;
|
import java.util.Map;
|
import java.util.Objects;
|
|
/**
|
* @author xp
|
* @date 2022/11/16
|
*/
|
@Component
|
@RequiredArgsConstructor
|
@Slf4j
|
public class CheckPointUtil {
|
|
private final RedisTemplate redisTemplate;
|
|
private final SelfHttpUtil selfHttpUtil;
|
|
/**
|
* 监测点位在线工具类
|
* @return
|
*/
|
public TMonitorResult check(TMonitorResult monitor) {
|
// 先检测能否访问该ip的网页
|
ResponseEntity<Object> res = null;
|
log.info("监测IP:" + monitor.getIp());
|
String prefix = "http://";
|
if ("127.0.0.1".equals(monitor.getIp())) {
|
monitor.setOnline(Boolean.FALSE);
|
return monitor;
|
}
|
try {
|
res = selfHttpUtil.get(prefix + monitor.getIp(), null, null);
|
monitor.setOnline(Objects.nonNull(res) && HttpStatus.OK == res.getStatusCode());
|
} catch (Exception e) {
|
monitor.setOnline(Boolean.FALSE);
|
}
|
// 如果http得到的不在线,那么再ping一下
|
boolean reachable = false;
|
Integer checkTimes = 1;
|
Integer offLineTimes = 0;
|
Map<String, Object> map = (Map<String, Object>) redisTemplate.opsForHash().get(RedisConstant.ONLINE_KEY, monitor.getIp());
|
if (!CollectionUtils.isEmpty(map)) {
|
checkTimes = (Integer) map.get("checkTimes") + 1;
|
offLineTimes = (Integer) map.get("offLineTimes");
|
} else {
|
map = new HashMap<>();
|
}
|
if (!monitor.getOnline()) {
|
try {
|
reachable = InetAddress.getByName(monitor.getIp()).isReachable(3000);
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
monitor.setOnline(reachable);
|
}
|
if (!monitor.getOnline()) {
|
offLineTimes++;
|
}
|
map.put("checkTimes", checkTimes);
|
map.put("offLineTimes", offLineTimes);
|
redisTemplate.opsForHash().put(RedisConstant.ONLINE_KEY, monitor.getIp(), map);
|
monitor.setCheckCount(checkTimes);
|
monitor.setOffLineCount(offLineTimes);
|
return monitor;
|
}
|
}
|