diff --git a/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java b/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java index c2183611..7a0632a3 100644 --- a/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java @@ -146,6 +146,34 @@ public class TaskTaskServiceImpl implements TaskService { return worker; } + /** + * 比较两个版本号 + * @param v1 版本号1 + * @param v2 版本号2 + * @return 负数表示 v1 < v2,0 表示相等,正数表示 v1 > v2 + */ + private int compareVersion(String v1, String v2) { + String[] parts1 = v1.split("\\."); + String[] parts2 = v2.split("\\."); + int maxLen = Math.max(parts1.length, parts2.length); + for (int i = 0; i < maxLen; i++) { + int num1 = i < parts1.length ? parseVersionPart(parts1[i]) : 0; + int num2 = i < parts2.length ? parseVersionPart(parts2[i]) : 0; + if (num1 != num2) { + return num1 - num2; + } + } + return 0; + } + + private int parseVersionPart(String part) { + try { + return Integer.parseInt(part.replaceAll("[^0-9]", "")); + } catch (NumberFormatException e) { + return 0; + } + } + private boolean isWorkerSelfHostedScenic(Long scenicId) { String cacheKey = String.format(WORKER_SELF_HOSTED_CACHE_KEY, scenicId); String cachedValue = redisTemplate.opsForValue().get(cacheKey); @@ -174,6 +202,13 @@ public class TaskTaskServiceImpl implements TaskService { worker.setStatus(null); // get status ClientStatusReqVo clientStatus = req.getClientStatus(); + // 版本校验:上报版本低于缓存版本时认为 worker 异常 + ClientStatusReqVo cachedStatus = repository.getWorkerHostStatus(worker.getId()); + if (cachedStatus != null && clientStatus != null + && cachedStatus.getVersion() != null && clientStatus.getVersion() != null + && compareVersion(clientStatus.getVersion(), cachedStatus.getVersion()) < 0) { + return null; + } repository.setWorkerHostStatus(worker.getId(), clientStatus); TaskSyncRespVo resp = new TaskSyncRespVo(); // Template @@ -428,11 +463,11 @@ public class TaskTaskServiceImpl implements TaskService { taskEntity.setTemplateId(templateId); taskEntity.setAutomatic(automatic ? 1 : 0); } - taskEntity.setWorkerId(null); taskEntity.setStatus(0); taskEntity.setTaskParams(JacksonUtil.toJSONString(sourcesMap)); if (isReuseOldTask) { taskMapper.update(taskEntity); + taskMapper.deassign(taskEntity.getId()); log.info("更新旧任务! taskId:{}", taskEntity.getId()); } else { taskMapper.add(taskEntity);