Browse Source

bug修复

master
luogw 4 weeks ago
parent
commit
cc3f8963fd
  1. 84
      src/main/java/com/project/interaction/domain/service/impl/GenerateQuestionQueueServiceImpl.java
  2. 9
      src/main/java/com/project/interaction/domain/service/impl/PostToGenerateQuestionDomainServiceImpl.java
  3. 2
      src/main/resources/application-dev.yml
  4. 2
      src/main/resources/application-test.yml

84
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}") @Value("${question.queue.retry-interval:60}")
private Long retryInterval; private Long retryInterval;
@Value("${question.queue.max-retry:10}")
private Integer maxRetry;
private PriorityBlockingQueue<GenerateQuestionQueueDTO> queue; private PriorityBlockingQueue<GenerateQuestionQueueDTO> queue;
/*按照权限降序、时间升序*/ /*按照权限降序、时间升序*/
@ -72,70 +69,44 @@ public class GenerateQuestionQueueServiceImpl implements GenerateQuestionQueueSe
@Override @Override
public List<GenerateQuestionQueueDTO> getRetryItems() { public List<GenerateQuestionQueueDTO> getRetryItems() {
List<GenerateQuestionQueueDTO> retryItems = new ArrayList<>(); capacityLock.lock();
List<GenerateQuestionQueueDTO> unRetryItems = new ArrayList<>(); try {
LocalDateTime now = LocalDateTime.now(); List<GenerateQuestionQueueDTO> retryItems = new ArrayList<>();
while (!queue.isEmpty()) {
GenerateQuestionQueueDTO item = queue.poll();
if (item == null) {
break;
}
GenerateQuestionQueueDTO latestItem = itemMap.get(item.getItemId()); while (!queue.isEmpty()) {
if (latestItem == null) { GenerateQuestionQueueDTO item = queue.poll();
currentSize.decrementAndGet(); if (item == null) {
continue; break;
} }
if (canRetry(latestItem, now)) { GenerateQuestionQueueDTO latestItem = itemMap.get(item.getItemId());
retryItems.add(latestItem); if (latestItem == null) {
} else {
if (latestItem.getRetryCount() >= maxRetry) {
itemMap.remove(latestItem.getItemId());
currentSize.decrementAndGet(); currentSize.decrementAndGet();
} else { continue;
unRetryItems.add(latestItem);
} }
retryItems.add(latestItem);
} }
}
for (GenerateQuestionQueueDTO item : unRetryItems) {
queue.offer(item);
}
return retryItems;
}
private boolean canRetry(GenerateQuestionQueueDTO item, LocalDateTime now) { return retryItems;
if (item.getRetryCount() >= maxRetry) { } finally {
log.warn(">>> [队列管理] 队列项重试次数已达上限, ItemId: {}, 重试次数: {}, 最大次数: {}", capacityLock.unlock();
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 true;
} }
@Override @Override
public boolean removeItem(String itemId) { public boolean removeItem(String itemId) {
GenerateQuestionQueueDTO removed = itemMap.remove(itemId); capacityLock.lock();
if (removed != null) { try {
currentSize.decrementAndGet(); GenerateQuestionQueueDTO removed = itemMap.remove(itemId);
log.info(">>> [队列管理] 成功移除队列项, ItemId: {}, 当前队列大小: {}", itemId, currentSize.get()); if (removed != null) {
return true; currentSize.decrementAndGet();
log.info(">>> [队列管理] 成功移除队列项, ItemId: {}, 当前队列大小: {}", itemId, currentSize.get());
return true;
}
return false;
} finally {
capacityLock.unlock();
} }
return false;
} }
@Override @Override
@ -149,6 +120,9 @@ public class GenerateQuestionQueueServiceImpl implements GenerateQuestionQueueSe
} }
capacityLock.lock(); capacityLock.lock();
try { try {
if (!itemMap.containsKey(item.getItemId())) {
currentSize.incrementAndGet();
}
itemMap.put(item.getItemId(), item); itemMap.put(item.getItemId(), item);
queue.offer(item); queue.offer(item);
} finally { } finally {

9
src/main/java/com/project/interaction/domain/service/impl/PostToGenerateQuestionDomainServiceImpl.java

@ -197,7 +197,6 @@ public class PostToGenerateQuestionDomainServiceImpl implements PostToGenerateQu
) )
.bodyToMono(GenerateQuestionResponseDTO.class) .bodyToMono(GenerateQuestionResponseDTO.class)
.timeout(Duration.ofSeconds(30)) // 30秒超时 .timeout(Duration.ofSeconds(30)) // 30秒超时
.retry(2) // 失败重试2次
.block(); // 同步等待结果 .block(); // 同步等待结果
log.info(">>> [题目生成] 算法服务成功接收任务, TaskId: {}, AlgoTaskId: {}, 状态: {}", log.info(">>> [题目生成] 算法服务成功接收任务, TaskId: {}, AlgoTaskId: {}, 状态: {}",
@ -240,7 +239,7 @@ public class PostToGenerateQuestionDomainServiceImpl implements PostToGenerateQu
/** /**
* 重试生成题目 * 重试生成题目
* @return true 如果需要重新入队等待下次重试false 如果处理完成成功或达到最大重试次数 * @return true 如果需要重新入队等待下次重试false 如果处理完成
*/ */
private boolean retryGenerateQuestion(GenerateQuestionQueueDTO item){ private boolean retryGenerateQuestion(GenerateQuestionQueueDTO item){
log.info(">>> [队列管理] 开始重试题目生成, 重试次数: {},ItemId: {}, TaskId: {}", log.info(">>> [队列管理] 开始重试题目生成, 重试次数: {},ItemId: {}, TaskId: {}",
@ -258,11 +257,7 @@ public class PostToGenerateQuestionDomainServiceImpl implements PostToGenerateQu
KnowledgePointEntity knowledgePoint = knowledgePointBaseService.getById( KnowledgePointEntity knowledgePoint = knowledgePointBaseService.getById(
item.getDtoList().get(0).getAtomId()); item.getDtoList().get(0).getAtomId());
GenerateQuestionResponseDTO response = callAlgorithmService( GenerateQuestionResponseDTO response = callAlgorithmService(item.getDtoList(), item.getQuestionType(), item.getNum(), knowledgePoint.getParseName());
item.getDtoList(),
item.getQuestionType(),
item.getNum(),
knowledgePoint.getParseName());
if (response != null && StringUtils.isNotBlank(response.getMessage()) && if (response != null && StringUtils.isNotBlank(response.getMessage()) &&
response.getMessage().contains("success")) { response.getMessage().contains("success")) {

2
src/main/resources/application-dev.yml

@ -91,7 +91,5 @@ question:
queue: queue:
# 重试间隔(秒) # 重试间隔(秒)
retry-interval: 60 retry-interval: 60
# 最大重试次数
max-retry: 100
scheduled-task: scheduled-task:
owner: test owner: test

2
src/main/resources/application-test.yml

@ -89,8 +89,6 @@ question:
queue: queue:
# 重试间隔(秒) # 重试间隔(秒)
retry-interval: 60 retry-interval: 60
# 最大重试次数
max-retry: 100
scheduled-task: scheduled-task:
owner: test owner: test
Loading…
Cancel
Save