You've already forked FrameTour-BE
feat(task): 添加版本校验和任务重分配功能
- 实现版本号比较方法,支持版本号大小判断 - 添加客户端版本校验逻辑,防止低版本上报覆盖高版本缓存 - 增加任务重分配功能,在更新旧任务时解除任务分配 - 修复worker状态处理中的版本冲突问题
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user