task-34: 将 ownerInstanceId 从 JSON 查询迁移到显式列并补充索引

This commit is contained in:
2026-08-29 20:44:21 +08:00
parent 790267560a
commit 11e19ef4f1
4 changed files with 413 additions and 6 deletions
@@ -116,12 +116,18 @@ public class ShopDataCrawlTaskService {
public void finalizeOwnedStaleTasks() {
long minutes = Math.max(1L, staleTimeoutMinutes);
long nowMillis = System.currentTimeMillis();
List<FileTaskEntity> tasks = fileTaskMapper.selectList(new LambdaQueryWrapper<FileTaskEntity>()
.eq(FileTaskEntity::getModuleType, MODULE_TYPE)
.eq(FileTaskEntity::getStatus, "RUNNING")
.apply("JSON_UNQUOTE(JSON_EXTRACT(request_json, '$.ownerInstanceId')) = {0}", currentInstanceId())
.lt(FileTaskEntity::getUpdatedAt, LocalDateTime.now().minusMinutes(minutes))
.last("limit 200"));
List<FileTaskEntity> tasks;
try {
tasks = fileTaskMapper.selectList(new LambdaQueryWrapper<FileTaskEntity>()
.eq(FileTaskEntity::getModuleType, MODULE_TYPE)
.eq(FileTaskEntity::getStatus, "RUNNING")
.eq(FileTaskEntity::getOwnerInstanceId, currentInstanceId())
.lt(FileTaskEntity::getUpdatedAt, LocalDateTime.now().minusMinutes(minutes))
.last("limit 200"));
} catch (Exception ex) {
log.warn("[shop-data-crawl] stale task scan failed msg={}", ex.getMessage());
return;
}
Map<Long, Long> heartbeats = taskCacheService.getTaskHeartbeatMillisBatch(
tasks.stream().map(FileTaskEntity::getId).toList());
for (FileTaskEntity task : tasks) {
@@ -1137,6 +1143,7 @@ public class ShopDataCrawlTaskService {
requestSnapshot.put("items", requestItems);
requestSnapshot.put("countryCodes", countryCodes);
task.setRequestJson(objectMapper.writeValueAsString(requestSnapshot));
task.setOwnerInstanceId(currentInstanceId());
task.setResultJson(objectMapper.writeValueAsString(snapshots));
syncSnapshotTables(task, snapshots);
fileTaskMapper.updateById(task);
@@ -2555,7 +2562,22 @@ public class ShopDataCrawlTaskService {
throw new TaskOwnerMismatchException(task == null ? null : task.getId(), operation, owner, currentInstanceId());
}
/**
* 任务归属实例 id:优先读显式列 owner_instance_idTask 34 迁移),
* 旧任务列缺失时兼容回退到 request_json.ownerInstanceId。
*/
public String ownerInstanceIdOf(FileTaskEntity task) {
if (task != null && !blank(task.getOwnerInstanceId())) {
return task.getOwnerInstanceId();
}
return ownerFromJson(task);
}
private String ownerFromTask(FileTaskEntity task) {
return ownerInstanceIdOf(task);
}
private String ownerFromJson(FileTaskEntity task) {
if (task == null || blank(task.getRequestJson())) return null;
try {
String owner = objectMapper.readTree(task.getRequestJson()).path("ownerInstanceId").asText("");
@@ -25,6 +25,7 @@ public class FileTaskEntity {
private String errorMessage;
private String createdBy;
private Long userId;
private String ownerInstanceId;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
private LocalDateTime finishedAt;