From e3eebc41e9b1e5c92fc6212fe51dcce8da366306 Mon Sep 17 00:00:00 2001 From: xiangpei <xiangpei@timesnew.cn> Date: 星期二, 10 九月 2024 15:26:06 +0800 Subject: [PATCH] 监测点位在线完善 --- ycl-common/src/main/java/constant/RedisConstant.java | 4 ycl-server/src/main/java/com/ycl/platform/mapper/TMonitorMapper.java | 6 ycl-server/src/main/java/com/ycl/task/UYTask.java | 103 +++++++++++-------- ycl-server/src/main/java/com/ycl/platform/service/WorkOrderService.java | 3 ycl-server/src/main/java/com/ycl/thread/OnlineCheckThread.java | 129 +++++++++++++++++++++++++ ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml | 16 ++- ycl-pojo/src/main/java/com/ycl/platform/domain/vo/OnlineThreadVO.java | 21 ++++ 7 files changed, 228 insertions(+), 54 deletions(-) diff --git a/ycl-common/src/main/java/constant/RedisConstant.java b/ycl-common/src/main/java/constant/RedisConstant.java index b576a18..b6a9361 100644 --- a/ycl-common/src/main/java/constant/RedisConstant.java +++ b/ycl-common/src/main/java/constant/RedisConstant.java @@ -6,4 +6,8 @@ //杞﹁締銆佷汉鑴稿湪绾跨巼 Redis 姣忔湀鏁版嵁涓柇娆℃暟 Hash key public final static String Check_Car_ViewConnect = "CarViewConnectNoData"; public final static String Check_Face_ViewConnect = "FaceViewConnectNoData"; + + /** 鐐逛綅鍦ㄧ嚎锛宧ash鐨刱ey */ + public final static String ONLINE_PREFIX = "ONLINE_"; + } diff --git a/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/OnlineThreadVO.java b/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/OnlineThreadVO.java new file mode 100644 index 0000000..c952333 --- /dev/null +++ b/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/OnlineThreadVO.java @@ -0,0 +1,21 @@ +package com.ycl.platform.domain.vo; + +import com.ycl.platform.domain.entity.WorkOrder; +import lombok.Data; + +/** + * 鐩戞祴鍦ㄧ嚎鐨勭嚎绋嬭繑鍥炲璞� + * + * @author锛歺p + * @date锛�2024/9/10 11:44 + */ +@Data +public class OnlineThreadVO { + + private Boolean online; + + private String ip; + + private WorkOrder workOrder; + +} diff --git a/ycl-server/src/main/java/com/ycl/platform/mapper/TMonitorMapper.java b/ycl-server/src/main/java/com/ycl/platform/mapper/TMonitorMapper.java index c870cd6..96507b0 100644 --- a/ycl-server/src/main/java/com/ycl/platform/mapper/TMonitorMapper.java +++ b/ycl-server/src/main/java/com/ycl/platform/mapper/TMonitorMapper.java @@ -155,11 +155,11 @@ * * @return */ - List<String> getDistinctIP(); + List<TMonitor> getDistinctIP(); /** * 鏍规嵁ip淇敼鐐逛綅琛ㄧ殑鏄惁鍦ㄧ嚎瀛楁 - * @param online + * @param onlineList */ - void updateOnline(@Param("online") UpdateOnlineVO online); + void updateOnline(@Param("onlineList") List<UpdateOnlineVO> onlineList); } diff --git a/ycl-server/src/main/java/com/ycl/platform/service/WorkOrderService.java b/ycl-server/src/main/java/com/ycl/platform/service/WorkOrderService.java index 0c54687..e968d6d 100644 --- a/ycl-server/src/main/java/com/ycl/platform/service/WorkOrderService.java +++ b/ycl-server/src/main/java/com/ycl/platform/service/WorkOrderService.java @@ -26,13 +26,12 @@ public interface WorkOrderService extends IService<WorkOrder> { /** - * 绯荤粺鍐呴儴鐨勬坊鍔狅紝涓嬪彂 + * 绯荤粺鍐呴儴鐨勬坊鍔� * * @param workOrderList * @return */ Boolean innerAddWorkOrder(List<WorkOrder> workOrderList); - /** * 娣诲姞 diff --git a/ycl-server/src/main/java/com/ycl/task/UYTask.java b/ycl-server/src/main/java/com/ycl/task/UYTask.java index 2c3ae39..c070048 100644 --- a/ycl-server/src/main/java/com/ycl/task/UYTask.java +++ b/ycl-server/src/main/java/com/ycl/task/UYTask.java @@ -3,24 +3,33 @@ import com.alibaba.fastjson2.JSONObject; import com.mongodb.client.result.DeleteResult; import com.ycl.feign.UYClient; +import com.ycl.platform.domain.entity.TMonitor; +import com.ycl.platform.domain.entity.WorkOrder; import com.ycl.platform.domain.entity.YwPoint; import com.ycl.platform.domain.param.UY.*; import com.ycl.platform.domain.result.UY.RecordMetaDSumResult; import com.ycl.platform.domain.result.UY.*; +import com.ycl.platform.domain.vo.OnlineThreadVO; import com.ycl.platform.domain.vo.UpdateOnlineVO; import com.ycl.platform.mapper.TMonitorMapper; import com.ycl.platform.service.UYErrorTypeCheckService; +import com.ycl.platform.service.WorkOrderService; import com.ycl.platform.service.YwPointService; +import com.ycl.system.domain.SysConfig; +import com.ycl.system.mapper.SysConfigMapper; +import com.ycl.thread.OnlineCheckThread; import com.ycl.utils.DateUtils; import com.ycl.utils.http.HttpUtils; import com.ycl.utils.http.SelfHttpUtil; import constant.ApiConstants; +import constant.RedisConstant; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatusCode; import org.springframework.http.ResponseEntity; @@ -30,14 +39,10 @@ import java.io.IOException; import java.net.InetAddress; import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.List; -import java.util.Objects; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; +import java.util.*; +import java.util.concurrent.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; //浼樹簯瀵规帴鏁版嵁浠诲姟 @Slf4j @@ -51,6 +56,9 @@ private final YwPointService pointService; private final TMonitorMapper monitorMapper; private final SelfHttpUtil selfHttpUtil; + private final RedisTemplate redisTemplate; + private final WorkOrderService workOrderService; + private final SysConfigMapper sysConfigMapper; @Value("${youYun.tenantId}") private String tenantId; @@ -170,44 +178,51 @@ /** * 鐐逛綅鍦ㄧ嚎妫�娴� */ - public void pointOnline() { + public void pointOnline() throws ExecutionException, InterruptedException { log.info("寮�濮嬫娴嬬偣浣嶅湪绾�"); - // 鍏堟煡鍑鸿澶嘔P闆嗗悎 - List<String> ipList = monitorMapper.getDistinctIP(); - String prefix = "http://"; - Date now = new Date(); - for (String ip : ipList) { - executorService.submit(() -> { - // 鍏堟娴嬭兘鍚﹁闂ip鐨勭綉椤� - ResponseEntity<Object> res = null; - UpdateOnlineVO online = new UpdateOnlineVO(); - online.setIp(ip); - if ("127.0.0.1".equals(ip)) { - online.setOnline(Boolean.FALSE); - monitorMapper.updateOnline(online); - return; - } - try { - res = selfHttpUtil.get(prefix + ip, null, null); - online.setOnline(Objects.nonNull(res) && HttpStatus.OK == res.getStatusCode()); - } catch (Exception e) { - online.setOnline(Boolean.FALSE); - } - online.setUpdateTime(now); - - // 濡傛灉http寰楀埌鐨勪笉鍦ㄧ嚎锛岄偅涔堝啀ping涓�涓� - boolean reachable = false; - if (! online.getOnline()) { - try { - reachable = InetAddress.getByName(ip).isReachable(3000); - } catch (IOException e) { - e.printStackTrace(); - } - online.setOnline(reachable); - } - monitorMapper.updateOnline(online); - }); + Integer times = 2; + SysConfig config = new SysConfig(); + config.setConfigKey("DAY_OF_POINT_OUTLINE_TIMES"); + SysConfig sysConfig = sysConfigMapper.selectConfig(config); + if (Objects.nonNull(sysConfig)) { + times = Integer.valueOf(sysConfig.getConfigValue()); + } else { + log.error("璇烽厤缃绾挎鏁帮紝姝ゆ璁剧疆涓洪粯璁ゅ��2"); } + // 鍏堟煡鍑鸿澶嘔P闆嗗悎 + List<TMonitor> monitorList = monitorMapper.getDistinctIP(); + List<Future<OnlineThreadVO>> futureList = new ArrayList<>(48); + List<OnlineThreadVO> dataList = new ArrayList<>(48); + for (TMonitor monitor : monitorList) { + OnlineCheckThread thread = new OnlineCheckThread(monitor, redisTemplate, selfHttpUtil, times); + Future<OnlineThreadVO> future = executorService.submit(thread); + futureList.add(future); + } + for (Future<OnlineThreadVO> future : futureList) { + dataList.add(future.get()); // get鏂规硶浼氶樆濉烇紝鐭ラ亾鎷垮埌缁撴灉鎵嶇户缁墽琛宖or + } + + // 鏇存柊point琛ㄧ殑鍦ㄧ嚎鏍囪瘑 + Date now = new Date(); + List<UpdateOnlineVO> willUpdateList = dataList.stream().map(item -> { + UpdateOnlineVO vo = new UpdateOnlineVO(); + vo.setOnline(item.getOnline()); + vo.setIp(item.getIp()); + vo.setUpdateTime(now); + return vo; + }).collect(Collectors.toList()); + monitorMapper.updateOnline(willUpdateList); + + // 宸ュ崟 + List<WorkOrder> workOrderList = dataList.stream() + .filter(item -> Objects.nonNull(item.getWorkOrder())) + .map(OnlineThreadVO::getWorkOrder) + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(workOrderList)) { + return; + } + workOrderService.innerAddWorkOrder(workOrderList); + log.info("鐐逛綅鍦ㄧ嚎鐩戞祴瀹屾垚"); } //鐐逛綅鍦ㄧ嚎鐜� diff --git a/ycl-server/src/main/java/com/ycl/thread/OnlineCheckThread.java b/ycl-server/src/main/java/com/ycl/thread/OnlineCheckThread.java new file mode 100644 index 0000000..4003e46 --- /dev/null +++ b/ycl-server/src/main/java/com/ycl/thread/OnlineCheckThread.java @@ -0,0 +1,129 @@ +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锛歺p + * @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; + } + +} diff --git a/ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml b/ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml index 7c7aef2..9bb7416 100644 --- a/ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml +++ b/ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml @@ -583,16 +583,22 @@ serial_number in <foreach collection="gbList" open="(" separator="," close=")" item="no">#{no}</foreach> </select> - <select id="getDistinctIP" resultType="string"> + <select id="getDistinctIP" resultType="com.ycl.platform.domain.entity.TMonitor"> SELECT - DISTINCT ip + DISTINCT ip, serial_number FROM t_monitor </select> <update id="updateOnline"> - update t_yw_ponit set online = #{online.online}, update_time = #{online.updateTime} WHERE EXISTS ( - SELECT 1 FROM t_monitor WHERE ip = #{online.ip} AND t_monitor.serial_number = t_yw_point.serial_number - ); + <foreach collection="onlineList" item="online" separator=";"> + UPDATE + t_yw_point + SET + online = #{online.online}, + update_time = #{online.updateTime} + WHERE + EXISTS (SELECT 1 FROM t_monitor WHERE ip = #{online.ip} AND t_monitor.serial_number = t_yw_point.serial_number) + </foreach> </update> </mapper> -- Gitblit v1.8.0