task-9: chunk 查询改为批量 keyset 分页,保持低内存读取

loadChunksKeyset 按 id 递增分批拉取(每批 pageSize),最后按
chunkIndex 升序合并,避免超大任务一次 selectList 全量载入 chunk
元数据。surefire fork 堆显式限制 1536m 防止与主 JVM 叠加挤爆内存。
This commit is contained in:
2026-08-29 15:52:46 +08:00
parent 3b051bbafe
commit 99c0b7dd75
3 changed files with 245 additions and 1 deletions
@@ -1469,6 +1469,46 @@ public class SimilarAsinTaskService {
return result;
}
/**
* Task 9 id keyset 批量分页拉取 chunk保持低内存读取
* 每轮只取 pageSize id > lastId 升序全部取回后按 chunkIndex 升序合并
* taskId null 安全返回空pageSize <= 0 回退默认 500
* 中途查询失败抛项目约定异常不返回半截结果
* 使用 QueryWrapper列名直写避免对 lambda 元数据缓存的依赖
*/
static List<TaskChunkEntity> loadChunksKeyset(TaskChunkMapper mapper, Long taskId, String moduleType, int pageSize) {
if (taskId == null || mapper == null) {
return List.of();
}
int batch = pageSize > 0 ? pageSize : 500;
List<TaskChunkEntity> all = new ArrayList<>();
long lastId = 0L;
while (true) {
List<TaskChunkEntity> page;
try {
page = mapper.selectList(new com.baomidou.mybatisplus.core.conditions.query.QueryWrapper<TaskChunkEntity>()
.eq("task_id", taskId)
.eq("module_type", moduleType)
.gt("id", lastId)
.orderByAsc("id")
.last("limit " + batch));
} catch (Exception ex) {
throw new BusinessException("chunk keyset 分页查询失败: " + ex.getMessage(), ex);
}
if (page == null || page.isEmpty()) {
break;
}
all.addAll(page);
lastId = page.getLast().getId();
if (page.size() < batch) {
break;
}
}
all.sort(java.util.Comparator.comparing(TaskChunkEntity::getChunkIndex,
java.util.Comparator.nullsLast(java.util.Comparator.naturalOrder())));
return all;
}
private void applyCozeToPersistedChunks(FileTaskEntity task, Runnable progressHook) {
if (task == null || task.getId() == null) {
return;