| | |
| | | List<String> onlyCms=cmsPlateNos.stream().filter(e->!notCmsVehicles.contains(e)).collect((Collectors.toList())); |
| | | |
| | | Integer syncCarCount=0; |
| | | response.getDevices().stream().filter(e->onlyCms.contains(this.getPlateNo(e.getVid()))).forEach(vehicle->{ |
| | | for (CmsVehicleDeviceListResponse.CmsVehicleDevice vehicle : response.getDevices()) { |
| | | try { |
| | | if (!onlyCms.contains(this.getPlateNo(vehicle.getVid()))) { |
| | | continue; |
| | | } |
| | | |
| | | String plateNo =this.getPlateNo(vehicle.getVid()); |
| | | |
| | | // 使用重试机制处理死锁 |
| | | int maxRetries = 3; |
| | | int retryCount = 0; |
| | | boolean success = false; |
| | | |
| | | while (!success && retryCount < maxRetries) { |
| | | try { |
| | | // 查询车辆信息(使用精确匹配) |
| | | VehicleInfo vehicleInfo= vehicleInfoService.selectVehicleInfoByPlateNumber(plateNo); |
| | | if (vehicleInfo==null) { |
| | | // 新增车辆 |
| | | vehicleInfo = new VehicleInfo(); |
| | | vehicleInfo.setVehicleNo(plateNo); |
| | | vehicleInfo.setDeviceId(vehicle.getDid()); |
| | | vehicleInfo.setPlatformCode("CMS"); |
| | | vehicleInfo.setStatus("0"); |
| | | vehicleInfoService.insertVehicleInfo(vehicleInfo); |
| | | } |
| | | else{ |
| | | vehicleInfo.setVehicleNo(plateNo); |
| | | syncCarCount++; |
| | | log.info("新增CMS车辆: {}", plateNo); |
| | | } else { |
| | | // 更新车辆 - 仅更新必要字段,避免触发关联表操作 |
| | | vehicleInfo.setDeviceId(vehicle.getDid()); |
| | | vehicleInfo.setPlatformCode("CMS"); |
| | | vehicleInfo.setStatus("0"); |
| | | vehicleInfo.setDeptIds(null); // 不更新部门关联,避免死锁 |
| | | vehicleInfoService.updateVehicleInfo(vehicleInfo); |
| | | syncCarCount++; |
| | | log.debug("更新CMS车辆: {}", plateNo); |
| | | } |
| | | |
| | | }); |
| | | success = true; |
| | | } catch (org.springframework.dao.DeadlockLoserDataAccessException e) { |
| | | retryCount++; |
| | | if (retryCount < maxRetries) { |
| | | log.warn("同步车辆 {} 遇到死锁,第{}次重试", plateNo, retryCount); |
| | | // 随机等待50-200ms后重试,避免多个线程同时重试 |
| | | Thread.sleep(50 + (long)(Math.random() * 150)); |
| | | } else { |
| | | log.error("同步车辆 {} 失败: 死锁重试{}次后仍失败", plateNo, maxRetries); |
| | | throw e; |
| | | } |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("同步车辆 {} 失败: {}", vehicle.getVid(), e.getMessage()); |
| | | // 继续处理下一个车辆 |
| | | } |
| | | } |
| | | |
| | | |
| | | |