| | |
| | | */ |
| | | @Scheduled(fixedRate = 5000) |
| | | public void syncBoxInfo() { |
| | | ArdServerInfo ardServerInfo = new ArdServerInfo(); |
| | | ardServerInfo.setUseDataScope(false); |
| | | List<ArdServerInfo> servers = ardServerInfoService.selectArdServerInfoList(ardServerInfo); |
| | | log.debug("定时执行同步盒子属性任务"); |
| | | try { |
| | | ArdServerInfo ardServerInfo = new ArdServerInfo(); |
| | | ardServerInfo.setUseDataScope(false); |
| | | List<ArdServerInfo> servers = ardServerInfoService.selectArdServerInfoList(ardServerInfo); |
| | | |
| | | for (ArdServerInfo server : servers) { |
| | | ArdDroneInfo droneInfo = new ArdDroneInfo(); |
| | | droneInfo.setServerId(server.getId()); |
| | | droneInfo.setUseDataScope(false); |
| | | List<ArdDroneInfo> localList = selectArdDroneList(droneInfo); |
| | | Map<String, ArdDroneInfo> localMap = localList.stream().collect(Collectors.toMap(ArdDroneInfo::getBoxSn, |
| | | d -> d)); |
| | | List<BoxInfoReceiver> boxList = tyService.getBoxList(server.getId()); |
| | | // server 没有返回设备列表 → 全部离线 |
| | | if (boxList == null || boxList.isEmpty()) { |
| | | for (ArdDroneInfo local : localList) { |
| | | if (local.getOnLine() != 0) { // 仅当状态变化才更新 |
| | | local.setOnLine(0); |
| | | ArdDroneInfoMapper.updateArdDrone(local); |
| | | eventPublisher.publishEvent(new DeviceStatusEvent(local.getBoxSn(), false)); |
| | | redisCache.deleteObject(CacheConstants.UAV_ONLINE_KEY + local.getBoxSn()); |
| | | for (ArdServerInfo server : servers) { |
| | | ArdDroneInfo droneInfo = new ArdDroneInfo(); |
| | | droneInfo.setServerId(server.getId()); |
| | | droneInfo.setUseDataScope(false); |
| | | List<ArdDroneInfo> localList = selectArdDroneList(droneInfo); |
| | | Map<String, ArdDroneInfo> localMap = localList.stream().collect(Collectors.toMap(ArdDroneInfo::getBoxSn, |
| | | d -> d)); |
| | | List<BoxInfoReceiver> boxList = tyService.getBoxList(server.getId()); |
| | | // server 没有返回设备列表 → 全部离线 |
| | | if (boxList == null || boxList.isEmpty()) { |
| | | for (ArdDroneInfo local : localList) { |
| | | if (local.getOnLine() != 0) { // 仅当状态变化才更新 |
| | | local.setOnLine(0); |
| | | ArdDroneInfoMapper.updateArdDrone(local); |
| | | eventPublisher.publishEvent(new DeviceStatusEvent(local.getBoxSn(), false)); |
| | | redisCache.deleteObject(CacheConstants.UAV_ONLINE_KEY + local.getBoxSn()); |
| | | } |
| | | } |
| | | continue; |
| | | } |
| | | continue; |
| | | } |
| | | // server 返回设备列表 → 通过缓存判断状态 |
| | | for (BoxInfoReceiver remote : boxList) { |
| | | String boxSn = remote.getBoxSn(); |
| | | String redisKey = CacheConstants.UAV_ONLINE_KEY + boxSn; |
| | | boolean currentOnline = remote.getOnLine() == 1; |
| | | // server 返回设备列表 → 通过缓存判断状态 |
| | | for (BoxInfoReceiver remote : boxList) { |
| | | String boxSn = remote.getBoxSn(); |
| | | String redisKey = CacheConstants.UAV_ONLINE_KEY + boxSn; |
| | | boolean currentOnline = remote.getOnLine() == 1; |
| | | |
| | | ArdDroneInfo local = localMap.get(boxSn); |
| | | boolean dbOnline = local != null && local.getOnLine() == 1; |
| | | boolean needUpdate = (dbOnline != currentOnline); |
| | | // 只要远端设备在线,就刷新Redis缓存(无论状态是否变化),保证缓存一定存在 |
| | | if (currentOnline) { |
| | | redisCache.setCacheObject(redisKey, remote); |
| | | } else { |
| | | // 远端离线,删除Redis缓存 |
| | | redisCache.deleteObject(redisKey); |
| | | } |
| | | // 如果状态变化才更新 |
| | | if (needUpdate){ |
| | | // 发布事件 |
| | | eventPublisher.publishEvent(new DeviceStatusEvent(boxSn, currentOnline)); |
| | | // 更新数据库 |
| | | if (local != null) { |
| | | local.setOnLine(currentOnline ? 1 : 0); |
| | | updateArdDrone(local); |
| | | ArdDroneInfo local = localMap.get(boxSn); |
| | | boolean dbOnline = local != null && local.getOnLine() == 1; |
| | | boolean needUpdate = (dbOnline != currentOnline); |
| | | // 只要远端设备在线,就刷新Redis缓存(无论状态是否变化),保证缓存一定存在 |
| | | if (currentOnline) { |
| | | redisCache.setCacheObject(redisKey, remote); |
| | | } else { |
| | | // 远端离线,删除Redis缓存 |
| | | redisCache.deleteObject(redisKey); |
| | | } |
| | | // 如果状态变化才更新 |
| | | if (needUpdate) { |
| | | // 发布事件 |
| | | eventPublisher.publishEvent(new DeviceStatusEvent(boxSn, currentOnline)); |
| | | // 更新数据库 |
| | | if (local != null) { |
| | | local.setOnLine(currentOnline ? 1 : 0); |
| | | updateArdDrone(local); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("同步盒子属性任务异常", e); |
| | | } |
| | | } |
| | | |