task-34: 将 ownerInstanceId 从 JSON 查询迁移到显式列并补充索引
This commit is contained in:
+28
-6
@@ -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_id(Task 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("");
|
||||
|
||||
+1
@@ -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;
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
ALTER TABLE `biz_file_task`
|
||||
ADD COLUMN `owner_instance_id` VARCHAR(128) NULL DEFAULT NULL COMMENT '任务归属实例 id(原存于 request_json.ownerInstanceId,迁移为显式列)' AFTER `user_id`,
|
||||
ADD KEY `idx_biz_file_task_owner_status_updated` (`owner_instance_id`, `status`, `updated_at`);
|
||||
Reference in New Issue
Block a user