From 8d3dae32f38281b7d540d6badabba1d9d150657b Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Mon, 5 Jan 2026 11:54:07 +0800 Subject: [PATCH] =?UTF-8?q?feat(task):=20=E6=B7=BB=E5=8A=A0=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E6=A0=A1=E9=AA=8C=E5=92=8C=E4=BB=BB=E5=8A=A1=E9=87=8D?= =?UTF-8?q?=E5=88=86=E9=85=8D=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 实现版本号比较方法,支持版本号大小判断 - 添加客户端版本校验逻辑,防止低版本上报覆盖高版本缓存 - 增加任务重分配功能,在更新旧任务时解除任务分配 - 修复worker状态处理中的版本冲突问题 --- .../task/impl/TaskTaskServiceImpl.java | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) 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);