package com.ycl.thread;
|
|
import com.ycl.platform.domain.entity.TMonitor;
|
import com.ycl.platform.domain.entity.WorkOrder;
|
import com.ycl.platform.domain.vo.OnlineThreadVO;
|
import com.ycl.platform.domain.vo.UpdateOnlineVO;
|
import com.ycl.utils.http.SelfHttpUtil;
|
import constant.RedisConstant;
|
import enumeration.ErrorType;
|
import enumeration.general.WorkOrderStatusEnum;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.http.HttpStatus;
|
import org.springframework.http.ResponseEntity;
|
|
import java.io.IOException;
|
import java.net.InetAddress;
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Objects;
|
import java.util.concurrent.Callable;
|
|
/**
|
* @author:xp
|
* @date:2024/9/10 11:43
|
*/
|
@Slf4j
|
public class OnlineCheckThread implements Callable<OnlineThreadVO> {
|
|
private TMonitor monitor;
|
|
private RedisTemplate redisTemplate;
|
|
private SelfHttpUtil selfHttpUtil;
|
|
private Integer times;
|
|
public OnlineCheckThread(TMonitor monitor, RedisTemplate redisTemplate, SelfHttpUtil selfHttpUtil, Integer times) {
|
this.monitor = monitor;
|
this.redisTemplate = redisTemplate;
|
this.selfHttpUtil = selfHttpUtil;
|
this.times = times;
|
}
|
|
public Integer getTimes() {
|
return times;
|
}
|
|
public void setTimes(Integer times) {
|
this.times = times;
|
}
|
|
public SelfHttpUtil getSelfHttpUtil() {
|
return selfHttpUtil;
|
}
|
|
public void setSelfHttpUtil(SelfHttpUtil selfHttpUtil) {
|
this.selfHttpUtil = selfHttpUtil;
|
}
|
|
public TMonitor getMonitor() {
|
return monitor;
|
}
|
|
public void setMonitor(TMonitor monitor) {
|
this.monitor = monitor;
|
}
|
|
public RedisTemplate getRedisTemplate() {
|
return redisTemplate;
|
}
|
|
public void setRedisTemplate(RedisTemplate redisTemplate) {
|
this.redisTemplate = redisTemplate;
|
}
|
|
@Override
|
public OnlineThreadVO call() throws Exception {
|
// 先检测能否访问该ip的网页
|
ResponseEntity<Object> res = null;
|
OnlineThreadVO vo = new OnlineThreadVO();
|
vo.setIp(monitor.getIp());
|
log.info("监测IP:" + monitor.getIp());
|
String prefix = "http://";
|
if ("127.0.0.1".equals(monitor.getIp())) {
|
vo.setOnline(Boolean.FALSE);
|
return vo;
|
}
|
try {
|
res = selfHttpUtil.get(prefix + monitor.getIp(), null, null);
|
vo.setOnline(Objects.nonNull(res) && HttpStatus.OK == res.getStatusCode());
|
} catch (Exception e) {
|
vo.setOnline(Boolean.FALSE);
|
}
|
|
// 如果http得到的不在线,那么再ping一下
|
boolean reachable = false;
|
if (!vo.getOnline()) {
|
try {
|
reachable = InetAddress.getByName(monitor.getIp()).isReachable(3000);
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
vo.setOnline(reachable);
|
}
|
if (!vo.getOnline()) {
|
Integer outLineTimes = (Integer) redisTemplate.opsForHash().get(RedisConstant.ONLINE_PREFIX, monitor.getIp());
|
if (Objects.isNull(outLineTimes)) {
|
outLineTimes = 1;
|
} else {
|
outLineTimes += 1;
|
}
|
redisTemplate.opsForHash().put(RedisConstant.ONLINE_PREFIX, monitor.getIp(), outLineTimes);
|
// 一天内监测到离线1次以上,生成工单
|
if (outLineTimes >= times) {
|
WorkOrder workOrder = new WorkOrder();
|
workOrder.setSerialNumber(monitor.getSerialNumber());
|
List<String> errList = new ArrayList<>();
|
errList.add(ErrorType.DEVICE_OFFLINE.getValue());
|
workOrder.setErrorTypeList(errList);
|
workOrder.setStatus(WorkOrderStatusEnum.DISTRIBUTED);
|
vo.setWorkOrder(workOrder);
|
}
|
}
|
return vo;
|
}
|
|
}
|