Browse Source

套题生成添加超时机制

master
luogw 1 month ago
parent
commit
1c38929000
  1. 15
      src/main/java/com/project/classicpaper/config/ClassicPaperTimeoutProperties.java
  2. 3
      src/main/java/com/project/classicpaper/domain/enums/ClassicPaperStatusEnum.java
  3. 71
      src/main/java/com/project/classicpaper/domain/job/ClassicPaperGenerationTimeoutJob.java
  4. 7
      src/main/resources/application-dev.yml
  5. 12
      src/main/resources/application-prod.yml
  6. 6
      src/main/resources/application-test.yml

15
src/main/java/com/project/classicpaper/config/ClassicPaperTimeoutProperties.java

@ -0,0 +1,15 @@
package com.project.classicpaper.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "classicpaper.timeout")
public class ClassicPaperTimeoutProperties {
private int thresholdMinutes = 120;
private long intervalMs = 300000L;
}

3
src/main/java/com/project/classicpaper/domain/enums/ClassicPaperStatusEnum.java

@ -10,7 +10,8 @@ public enum ClassicPaperStatusEnum implements HasValueEnum<Integer> {
GENERATING(0, "生成中"),
DRAFT(1, "已生成"),
CONFIRMED(2, "已固化"),
DISCARDED(3, "已废弃");
DISCARDED(3, "已废弃"),
FAILED(4,"生成失败");
private final Integer value;
private final String desc;

71
src/main/java/com/project/classicpaper/domain/job/ClassicPaperGenerationTimeoutJob.java

@ -0,0 +1,71 @@
package com.project.classicpaper.domain.job;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.project.base.config.ScheduledTaskProperties;
import com.project.classicpaper.config.ClassicPaperTimeoutProperties;
import com.project.classicpaper.domain.entity.ClassicPaperSetEntity;
import com.project.classicpaper.domain.enums.ClassicPaperStatusEnum;
import com.project.classicpaper.domain.service.ClassicPaperSetBaseService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
* 套题组生成超时检测
* 扫描 status=GENERATING create_time 超过阈值的套题组标记为 FAILED
* 防止算法侧漏回调导致套题组永久停留在"生成中"
*/
@Service
@Slf4j
public class ClassicPaperGenerationTimeoutJob {
@Autowired
private ClassicPaperSetBaseService classicPaperSetBaseService;
@Autowired
private ScheduledTaskProperties taskProps;
@Autowired
private ClassicPaperTimeoutProperties timeoutProps;
@Scheduled(fixedRateString = "${classicpaper.timeout.interval-ms:300000}")
public void checkSetTimeout() {
if ("local".equalsIgnoreCase(taskProps.getOwner())) {
return;
}
Date cutoff = new Date(System.currentTimeMillis() - timeoutProps.getThresholdMinutes() * 60_000L);
try {
List<ClassicPaperSetEntity> stale = classicPaperSetBaseService.list(
new LambdaQueryWrapper<ClassicPaperSetEntity>()
.eq(ClassicPaperSetEntity::getStatus, ClassicPaperStatusEnum.GENERATING.getValue())
.lt(ClassicPaperSetEntity::getCreateTime, cutoff)
);
if (stale.isEmpty()) {
return;
}
for (ClassicPaperSetEntity set : stale) {
long elapsedMin = (System.currentTimeMillis() - set.getCreateTime().getTime()) / 60_000L;
boolean updated = classicPaperSetBaseService.lambdaUpdate()
.eq(ClassicPaperSetEntity::getId, set.getId())
.eq(ClassicPaperSetEntity::getStatus, ClassicPaperStatusEnum.GENERATING.getValue())
.set(ClassicPaperSetEntity::getStatus, ClassicPaperStatusEnum.FAILED.getValue())
.update();
if (updated) {
log.warn(">>> [套题超时] setId={}, createTime={}, elapsed={}min, 标记为生成失败",
set.getId(), set.getCreateTime(), elapsedMin);
}
}
} catch (Exception e) {
log.error(">>> [套题超时] 扫描异常", e);
}
}
}

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

@ -135,3 +135,10 @@ classicpaper:
# 补充任务初始延迟(毫秒),避免高峰期"挤"算法
replenish-delay-ms: 10000
# 套题生成超时检测
timeout:
# 生成超时阈值(分钟),超过此时间仍在 GENERATING 则标记为 FAILED
threshold-minutes: 120
# 检查间隔(毫秒),每 5 分钟扫描一次
interval-ms: 300000

12
src/main/resources/application-prod.yml

@ -109,3 +109,15 @@ classicpaper:
mock:
regenerate-delay-ms: 0
regenerate-delay-max-ms: 0
# 套题生成超时检测
timeout:
# 生成超时阈值(分钟),超过此时间仍在 GENERATING 则标记为 FAILED
threshold-minutes: 120
# 检查间隔(毫秒),每 5 分钟扫描一次
interval-ms: 300000
# 简答题异步评分
scoring:
# 每批最多处理多少道简答题
batch-size: 5
# 执行间隔(毫秒),每60秒扫描一次
interval-ms: 60000

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

@ -109,6 +109,12 @@ classicpaper:
# 是否启用真实算法(true=使用算法服务)
algorithm:
enabled: true
# 套题生成超时检测
timeout:
# 生成超时阈值(分钟),超过此时间仍在 GENERATING 则标记为 FAILED
threshold-minutes: 120
# 检查间隔(毫秒),每 5 分钟扫描一次
interval-ms: 300000
# 简答题异步评分
scoring:
# 每批最多处理多少道简答题

Loading…
Cancel
Save