From c3101ceb6bc4bf48820da53f31a05f4ac731d6da Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Mon, 8 Sep 2025 10:47:07 +0800 Subject: [PATCH] =?UTF-8?q?feat(task):=20=E4=BC=98=E5=8C=96=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=88=86=E5=8F=91=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增自托管景点缓存机制,减少重复查询 - 修改任务分配逻辑,排除自托管景点的任务 - 优化景点唯一性配置的读取方式 --- .../task/impl/TaskTaskServiceImpl.java | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) 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 024a8ff..8f1cd36 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 @@ -2,6 +2,7 @@ package com.ycwl.basic.service.task.impl; import cn.hutool.core.date.DateUtil; import com.ycwl.basic.integration.common.manager.RenderWorkerConfigManager; +import com.ycwl.basic.integration.common.manager.ScenicConfigManager; import com.ycwl.basic.utils.JacksonUtil; import com.ycwl.basic.biz.OrderBiz; import com.ycwl.basic.biz.TaskStatusBiz; @@ -81,6 +82,8 @@ import java.util.stream.Collectors; @Slf4j @Service public class TaskTaskServiceImpl implements TaskService { + private static final String WORKER_SELF_HOSTED_CACHE_KEY = "worker_self_hosted_scenic:%s"; + private static final int CACHE_EXPIRE_MINUTES = 3; @Autowired private TaskMapper taskMapper; @Autowired @@ -119,6 +122,8 @@ public class TaskTaskServiceImpl implements TaskService { private DeviceRepository deviceRepository; @Autowired private VideoReUploader videoReUploader; + @Autowired + private RedisTemplate redisTemplate; private RenderWorkerEntity getWorker(@NonNull WorkerAuthReqVo req) { String accessKey = req.getAccessKey(); @@ -128,6 +133,24 @@ public class TaskTaskServiceImpl implements TaskService { return repository.getWorkerByAccessKey(accessKey); } + private boolean isWorkerSelfHostedScenic(Long scenicId) { + String cacheKey = String.format(WORKER_SELF_HOSTED_CACHE_KEY, scenicId); + String cachedValue = redisTemplate.opsForValue().get(cacheKey); + + if (cachedValue != null) { + return Boolean.parseBoolean(cachedValue); + } + + // 缓存中没有,查询配置 + ScenicConfigManager config = scenicRepository.getScenicConfigManager(scenicId); + boolean workerSelfHostedScenic = Boolean.TRUE.equals(config.getBoolean("worker_self_hosted")); + + // 缓存结果,设置30分钟过期 + redisTemplate.opsForValue().set(cacheKey, String.valueOf(workerSelfHostedScenic), CACHE_EXPIRE_MINUTES, TimeUnit.MINUTES); + + return workerSelfHostedScenic; + } + @Override public TaskSyncRespVo handleSyncTask(@NonNull TaskReqVo req) { RenderWorkerEntity worker = getWorker(req); @@ -159,14 +182,19 @@ public class TaskTaskServiceImpl implements TaskService { } else { updTemplateList = templateRepository.getAllEnabledTemplateList(); } + RenderWorkerConfigManager configManager = repository.getWorkerConfigManager(worker.getId()); try { if (lock.tryLock(2, TimeUnit.SECONDS)) { try { List taskList; - if (worker.getScenicOnly() != null) { - taskList = taskMapper.selectNotRunningByScenicList(worker.getScenicOnly()); + if (Strings.isNotBlank(configManager.getString("scenic_only"))) { + taskList = taskMapper.selectNotRunningByScenicList(configManager.getString("scenic_only")); } else { - taskList = taskMapper.selectNotRunning(); + var _taskList = taskMapper.selectNotRunning(); + taskList = _taskList.stream().filter(task -> { + boolean workerSelfHostedScenic = isWorkerSelfHostedScenic(task.getScenicId()); + return !workerSelfHostedScenic; + }).toList(); } resp.setTasks(taskList); resp.setTemplates(updTemplateList);