ycl-pojo/src/main/java/com/ycl/platform/domain/result/SYS/TMonitorResult.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-server/src/main/java/com/ycl/config/RedisConfig.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-server/src/main/java/com/ycl/platform/service/impl/DataCenterServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-server/src/main/java/com/ycl/task/UYTask.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-server/src/main/java/com/ycl/thread/OnlineCheckThread.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-server/src/main/java/com/ycl/utils/CheckPointUtil.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
ycl-pojo/src/main/java/com/ycl/platform/domain/result/SYS/TMonitorResult.java
@@ -29,12 +29,11 @@ private String pingOnlineStr; /** 当日监测次数 */ private Integer checkCount; /** 当日离线 */ /** 当日离线次数 */ private Integer offLineCount; /** * 离线时间点 */ private List<Date> offLineTime; private List<String> offLineTimeStr; /** 设备类型 */ private String monitorType; @@ -42,6 +41,8 @@ private String name; private WorkOrder workOrder; private Integer pointId; /** 只用作当此检测结果判断,不作展示 */ private Boolean createWorkOrder; /** * 动态列 */ ycl-server/src/main/java/com/ycl/config/RedisConfig.java
@@ -11,7 +11,7 @@ /** * redis配置 * * * @author ruoyi */ @Configuration @@ -36,6 +36,7 @@ template.setHashValueSerializer(serializer); template.afterPropertiesSet(); return template; } ycl-server/src/main/java/com/ycl/platform/service/impl/DataCenterServiceImpl.java
@@ -86,8 +86,11 @@ if (params.getOption() != null) { query.addCriteria(Criteria.where("online").is(params.getOption())); } Sort sort = Sort.by( Sort.Order.asc("pingOnline") // 首先按照 pingOnline 升序排序 ); // 通过pingOnline字段排序,为false的排在前面 query.with(Sort.by(Sort.Order.asc("pingOnline"))); query.with(sort); //分页数量 long total = mongoTemplate.count(query, TMonitorResult.class); MongoUtil.setPage(query, params, TIME_FIELD); @@ -107,19 +110,13 @@ } else { item.setOnlineStr("未知"); } List<Date> offLineTime = item.getOffLineTime(); List<String> offLineTime = item.getOffLineTimeStr(); if(!CollectionUtils.isEmpty(offLineTime)) { //后续可以改成配置的离线次数(提取前n次,n为配置的离线次数) SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); if (offLineTime.size() > 1) { offLineTime = offLineTime.subList(0, 2); } List<String> dateStr = new ArrayList<>(); for (Date date : offLineTime) { String formatDate = format.format(date); dateStr.add(formatDate); } item.setOffLineTimeStr(dateStr); item.setOffLineTimeStr(offLineTime); } }); params.setDeptTag(-1); ycl-server/src/main/java/com/ycl/task/UYTask.java
@@ -195,7 +195,7 @@ for (TMonitorResult result : monitorList) { TMonitorResult mongoData = mongoMap.get(result.getNo()); if(mongoData!=null){ result.setOffLineTime(mongoData.getOffLineTime()); result.setOffLineTimeStr(mongoData.getOffLineTimeStr()); } } List<TMonitorResult> dataList = new ArrayList<>(48); @@ -206,37 +206,44 @@ return thread.call(); // 假设 OnlineCheckThread 实现了 Callable 接口 }, executorService) .orTimeout(60, TimeUnit.SECONDS) //出现异常 .exceptionally(ex -> { if (ex instanceof TimeoutException) { log.error("任务执行超时:"+monitor.getIp()); } else { log.error("任务执行异常:"+monitor.getIp() + ex); log.error("任务执行异常:"+monitor.getIp() +ex); ex.printStackTrace(); } int checkTimes = 1; int offLineTimes = 1; 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"); } monitor.setPingOnline(Boolean.FALSE); monitor.setCheckCount(checkTimes); monitor.setOffLineCount(offLineTimes); List<Date> offLineTime = monitor.getOffLineTime(); if(CollectionUtils.isEmpty(offLineTime)) offLineTime = new ArrayList<>(); offLineTime.add(new Date()); monitor.setOffLineTime(offLineTime); if (monitor.getOffLineCount() >= time) { WorkOrder workOrder = new WorkOrder(); workOrder.setSerialNumber(monitor.getNo()); List<String> errList = new ArrayList<>(); errList.add(ErrorType.DEVICE_OFFLINE.getValue()); workOrder.setErrorTypeList(errList); workOrder.setStatus(WorkOrderStatusEnum.DISTRIBUTED); monitor.setWorkOrder(workOrder); } return monitor; // 返回失败的结果 return null; // int checkTimes = 1; // int offLineTimes = 1; // Map<String, Object> map = (Map<String, Object>) redisTemplate.opsForHash().get(RedisConstant.ONLINE_KEY, monitor.getNo()); // if (!CollectionUtils.isEmpty(map)) { // checkTimes = (Integer) map.get("checkTimes") + 1; // offLineTimes = (Integer) map.get("offLineTimes"); // }else { // map = new HashMap<>(); // } // monitor.setPingOnline(Boolean.FALSE); // monitor.setCheckCount(checkTimes); // monitor.setOffLineCount(offLineTimes); // List<Date> offLineTime = monitor.getOffLineTime(); // if(CollectionUtils.isEmpty(offLineTime)) offLineTime = new ArrayList<>(); // offLineTime.add(new Date()); // monitor.setOffLineTime(offLineTime); // if (monitor.getOffLineCount() >= time) { // WorkOrder workOrder = new WorkOrder(); // workOrder.setSerialNumber(monitor.getNo()); // List<String> errList = new ArrayList<>(); // errList.add(ErrorType.DEVICE_OFFLINE.getValue()); // workOrder.setErrorTypeList(errList); // workOrder.setStatus(WorkOrderStatusEnum.DISTRIBUTED); // monitor.setWorkOrder(workOrder); // } // map.put("checkTimes", checkTimes); // map.put("offLineTimes", offLineTimes); // redisTemplate.opsForHash().put(RedisConstant.ONLINE_KEY, monitor.getNo(), map); // return monitor; // 返回失败的结果 })) .collect(Collectors.toList()); @@ -247,7 +254,7 @@ try { allOf.get(60, TimeUnit.SECONDS); // 给予额外的5秒来收集结果 } catch (TimeoutException e) { log.warn("部分任务未在指定时间内完成"); log.error("部分任务未在指定时间内完成"); } catch (Exception e2){ log.error("数据收集异常"+e2); } ycl-server/src/main/java/com/ycl/thread/OnlineCheckThread.java
@@ -62,9 +62,9 @@ @Override public TMonitorResult call() { TMonitorResult result = checkPointUtil.check(monitor); // 这次不在线且一天内监测到离线2次及以上,生成工单 if (!result.getPingOnline() && result.getOffLineCount() >= times) { TMonitorResult result = checkPointUtil.check(monitor,times); if (result.getCreateWorkOrder()!=null && result.getCreateWorkOrder()) { WorkOrder workOrder = new WorkOrder(); workOrder.setSerialNumber(result.getNo()); List<String> errList = new ArrayList<>(); ycl-server/src/main/java/com/ycl/utils/CheckPointUtil.java
@@ -25,6 +25,7 @@ import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.text.SimpleDateFormat; import java.util.*; /** @@ -44,9 +45,10 @@ /** * 监测点位在线工具类 * * @return */ public TMonitorResult check(TMonitorResult monitor) { public TMonitorResult check(TMonitorResult monitor,Integer times) { // 先检测能否访问该ip的网页 ResponseEntity<String> res = null; String prefix = "http://"; @@ -64,14 +66,23 @@ 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)) { Integer continueOffTimes = 0; List<String> offTimeList = new ArrayList<>(); // 从Redis获取数据时进行类型安全的转换 Map<String, Object> map = null; Object mapObj = redisTemplate.opsForHash().get(RedisConstant.ONLINE_KEY, monitor.getNo()); if (mapObj != null) { map = (Map<String, Object>) mapObj; checkTimes = (Integer) map.get("checkTimes") + 1; offLineTimes = (Integer) map.get("offLineTimes"); continueOffTimes = (Integer) map.get("continueOffTimes"); Object offTimeListObj = map.get("offTimeList"); if (offTimeListObj instanceof List) { offTimeList = new ArrayList<>((List<String>) offTimeListObj); } } else { map = new HashMap<>(); } if (!monitor.getPingOnline()) { try { reachable = InetAddress.getByName(monitor.getIp()).isReachable(5000); @@ -82,14 +93,30 @@ } if (!monitor.getPingOnline()) { offLineTimes++; List<Date> offLineTime = monitor.getOffLineTime(); if(CollectionUtils.isEmpty(offLineTime)) offLineTime = new ArrayList<>(); offLineTime.add(new Date()); monitor.setOffLineTime(offLineTime); continueOffTimes++; //记录离线时间 Date now = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); offTimeList.add(dateFormat.format(now)); //到达产生工单的阈值次数 if (continueOffTimes>=times) { //产生了工单才会存储离线时间,存储最近一次产生工单的这几个离线时间点 monitor.setOffLineTimeStr(offTimeList); monitor.setCreateWorkOrder(Boolean.TRUE); //产生了一次工单则清除 continueOffTimes = 0; offTimeList = new ArrayList<>(); } }else { //如果在线了,清空连续离线次数,清空离线时间 continueOffTimes = 0; offTimeList = new ArrayList<>(); } map.put("checkTimes", checkTimes); map.put("offLineTimes", offLineTimes); redisTemplate.opsForHash().put(RedisConstant.ONLINE_KEY, monitor.getIp(), map); map.put("continueOffTimes", continueOffTimes); map.put("offTimeList", offTimeList); redisTemplate.opsForHash().put(RedisConstant.ONLINE_KEY, monitor.getNo(), map); monitor.setCheckCount(checkTimes); monitor.setOffLineCount(offLineTimes); return monitor; @@ -98,6 +125,7 @@ /** * 监测点位在线 * * @return */ public CheckResult webCheck(CheckUtil checkUtil) { @@ -122,7 +150,7 @@ ResponseEntity<String> res = selfHttpUtil.get(prefix + checkUtil.getIp(), null, null); webReachable = Objects.nonNull(res) && HttpStatus.OK == res.getStatusCode(); } catch (Exception e) { log.info("检测web异常"+e.getMessage()); log.info("检测web异常" + e.getMessage()); webReachable = Boolean.FALSE; } // ping @@ -136,7 +164,7 @@ e.printStackTrace(); } String imgUrl = ""; if(pingReachable || webReachable) { if (pingReachable || webReachable) { // 查出国标设备,就一条数据 List<DeviceInfo> gbDevices = new LambdaQueryChainWrapper<>(deviceInfoMapper) .orderByDesc(DeviceInfo::getUpdateTime) @@ -152,21 +180,21 @@ } } String status = ""; if (! webReachable) { if (!webReachable) { status += "设备web访问失败;"; }else if(webReachable){ } else if (webReachable) { status += "设备web访问正常;"; } if (! pingReachable) { if (!pingReachable) { status += "设备ip未ping通;"; }else if(pingReachable){ } else if (pingReachable) { status += "设备ipPing正常;"; } if (StringUtils.isEmpty(imgUrl)) { status += "未获取到图片"; }else { } else { status += "获取图片正常"; } result.setStatus(status); @@ -198,9 +226,9 @@ e.printStackTrace(); } String status = ""; if (! pingReachable) { if (!pingReachable) { status += "ip未ping通;"; }else { } else { status += "成功"; } result.setStatus(status);