From cc3f8963fd6da041fb01dec745287e29b3eca501 Mon Sep 17 00:00:00 2001 From: luogw <3132758203@qq.com> Date: Sat, 28 Mar 2026 11:57:01 +0800 Subject: [PATCH] =?UTF-8?q?bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GenerateQuestionQueueServiceImpl.java | 84 +++++++------------ ...stToGenerateQuestionDomainServiceImpl.java | 9 +- src/main/resources/application-dev.yml | 2 - src/main/resources/application-test.yml | 2 - 4 files changed, 31 insertions(+), 66 deletions(-) diff --git a/src/main/java/com/project/interaction/domain/service/impl/GenerateQuestionQueueServiceImpl.java b/src/main/java/com/project/interaction/domain/service/impl/GenerateQuestionQueueServiceImpl.java index b9d9ec8..edf954a 100644 --- a/src/main/java/com/project/interaction/domain/service/impl/GenerateQuestionQueueServiceImpl.java +++ b/src/main/java/com/project/interaction/domain/service/impl/GenerateQuestionQueueServiceImpl.java @@ -21,9 +21,6 @@ public class GenerateQuestionQueueServiceImpl implements GenerateQuestionQueueSe @Value("${question.queue.retry-interval:60}") private Long retryInterval; - @Value("${question.queue.max-retry:10}") - private Integer maxRetry; - private PriorityBlockingQueue queue; /*按照权限降序、时间升序*/ @@ -72,70 +69,44 @@ public class GenerateQuestionQueueServiceImpl implements GenerateQuestionQueueSe @Override public List getRetryItems() { - List retryItems = new ArrayList<>(); - List unRetryItems = new ArrayList<>(); - LocalDateTime now = LocalDateTime.now(); - - while (!queue.isEmpty()) { - GenerateQuestionQueueDTO item = queue.poll(); - if (item == null) { - break; - } + capacityLock.lock(); + try { + List retryItems = new ArrayList<>(); - GenerateQuestionQueueDTO latestItem = itemMap.get(item.getItemId()); - if (latestItem == null) { - currentSize.decrementAndGet(); - continue; - } + while (!queue.isEmpty()) { + GenerateQuestionQueueDTO item = queue.poll(); + if (item == null) { + break; + } - if (canRetry(latestItem, now)) { - retryItems.add(latestItem); - } else { - if (latestItem.getRetryCount() >= maxRetry) { - itemMap.remove(latestItem.getItemId()); + GenerateQuestionQueueDTO latestItem = itemMap.get(item.getItemId()); + if (latestItem == null) { currentSize.decrementAndGet(); - } else { - unRetryItems.add(latestItem); + continue; } + retryItems.add(latestItem); } - } - - for (GenerateQuestionQueueDTO item : unRetryItems) { - queue.offer(item); - } - - return retryItems; - } - private boolean canRetry(GenerateQuestionQueueDTO item, LocalDateTime now) { - if (item.getRetryCount() >= maxRetry) { - log.warn(">>> [队列管理] 队列项重试次数已达上限, ItemId: {}, 重试次数: {}, 最大次数: {}", - item.getItemId(), item.getRetryCount(), maxRetry); - itemMap.remove(item.getItemId()); - currentSize.decrementAndGet(); - return false; - } - - if (item.getLastRetryTime() != null) { - long secondsElapsed = java.time.temporal.ChronoUnit.SECONDS - .between(item.getLastRetryTime(), now); - if (secondsElapsed < retryInterval) { - return false; - } + return retryItems; + } finally { + capacityLock.unlock(); } - - return true; } @Override public boolean removeItem(String itemId) { - GenerateQuestionQueueDTO removed = itemMap.remove(itemId); - if (removed != null) { - currentSize.decrementAndGet(); - log.info(">>> [队列管理] 成功移除队列项, ItemId: {}, 当前队列大小: {}", itemId, currentSize.get()); - return true; + capacityLock.lock(); + try { + GenerateQuestionQueueDTO removed = itemMap.remove(itemId); + if (removed != null) { + currentSize.decrementAndGet(); + log.info(">>> [队列管理] 成功移除队列项, ItemId: {}, 当前队列大小: {}", itemId, currentSize.get()); + return true; + } + return false; + } finally { + capacityLock.unlock(); } - return false; } @Override @@ -149,6 +120,9 @@ public class GenerateQuestionQueueServiceImpl implements GenerateQuestionQueueSe } capacityLock.lock(); try { + if (!itemMap.containsKey(item.getItemId())) { + currentSize.incrementAndGet(); + } itemMap.put(item.getItemId(), item); queue.offer(item); } finally { diff --git a/src/main/java/com/project/interaction/domain/service/impl/PostToGenerateQuestionDomainServiceImpl.java b/src/main/java/com/project/interaction/domain/service/impl/PostToGenerateQuestionDomainServiceImpl.java index c8dd5c4..a1b760b 100644 --- a/src/main/java/com/project/interaction/domain/service/impl/PostToGenerateQuestionDomainServiceImpl.java +++ b/src/main/java/com/project/interaction/domain/service/impl/PostToGenerateQuestionDomainServiceImpl.java @@ -197,7 +197,6 @@ public class PostToGenerateQuestionDomainServiceImpl implements PostToGenerateQu ) .bodyToMono(GenerateQuestionResponseDTO.class) .timeout(Duration.ofSeconds(30)) // 30秒超时 - .retry(2) // 失败重试2次 .block(); // 同步等待结果 log.info(">>> [题目生成] 算法服务成功接收任务, TaskId: {}, AlgoTaskId: {}, 状态: {}", @@ -240,7 +239,7 @@ public class PostToGenerateQuestionDomainServiceImpl implements PostToGenerateQu /** * 重试生成题目 - * @return true 如果需要重新入队等待下次重试,false 如果处理完成(成功或达到最大重试次数) + * @return true 如果需要重新入队等待下次重试,false 如果处理完成 */ private boolean retryGenerateQuestion(GenerateQuestionQueueDTO item){ log.info(">>> [队列管理] 开始重试题目生成, 重试次数: {},ItemId: {}, TaskId: {}", @@ -258,11 +257,7 @@ public class PostToGenerateQuestionDomainServiceImpl implements PostToGenerateQu KnowledgePointEntity knowledgePoint = knowledgePointBaseService.getById( item.getDtoList().get(0).getAtomId()); - GenerateQuestionResponseDTO response = callAlgorithmService( - item.getDtoList(), - item.getQuestionType(), - item.getNum(), - knowledgePoint.getParseName()); + GenerateQuestionResponseDTO response = callAlgorithmService(item.getDtoList(), item.getQuestionType(), item.getNum(), knowledgePoint.getParseName()); if (response != null && StringUtils.isNotBlank(response.getMessage()) && response.getMessage().contains("success")) { diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 71e02ba..7f6becb 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -91,7 +91,5 @@ question: queue: # 重试间隔(秒) retry-interval: 60 - # 最大重试次数 - max-retry: 100 scheduled-task: owner: test \ No newline at end of file diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index eb878e5..eb80aba 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -89,8 +89,6 @@ question: queue: # 重试间隔(秒) retry-interval: 60 - # 最大重试次数 - max-retry: 100 scheduled-task: owner: test \ No newline at end of file