Преглед на файлове

refactor(scheduler): 优化超时任务处理逻辑

- 添加超时消息常量定义
- 修改超时任务处理方法,区分按结果处理和直接超时失败的情况
- 新增 handleTimeoutOrderWithLatestResult 方法处理超时订单的最新结果
- 增加更详细的日志记录,包括已处理、超时失败和异常的数量统计
- 完善空任务ID和查询结果为空的边界情况处理
- 优化日志信息格式,提供更准确的处理状态统计
ChenYu преди 6 месеца
родител
ревизия
a992813d14
променени са 1 файла, в които са добавени 35 реда и са изтрити 4 реда
  1. 35 4
      src/main/java/com/aitori/scheduler/WorkflowTaskScheduler.java

+ 35 - 4
src/main/java/com/aitori/scheduler/WorkflowTaskScheduler.java

@@ -20,6 +20,8 @@ import java.util.List;
 @RequiredArgsConstructor
 public class WorkflowTaskScheduler {
 
+    private static final String TIMEOUT_MESSAGE = "任务执行超时(超过20分钟),系统自动标记失败";
+
     private final TAiOrderV2Service aiOrderV2Service;
     private final WorkflowTaskClient workflowTaskClient;
     private final WorkflowTaskResultHandler resultHandler;
@@ -93,19 +95,48 @@ public class WorkflowTaskScheduler {
         }
 
         log.info("开始处理超时任务自动失败, 共{}条", timeoutOrders.size());
-        int success = 0;
+        int timeoutFailed = 0;
+        int resultHandled = 0;
         int failed = 0;
 
         for (TAiOrderV2 order : timeoutOrders) {
             try {
-                resultHandler.handleTimeout(order, "任务执行超时(超过20分钟),系统自动标记失败");
-                success++;
+                if (handleTimeoutOrderWithLatestResult(order)) {
+                    resultHandled++;
+                } else {
+                    timeoutFailed++;
+                }
             } catch (Exception e) {
                 failed++;
                 log.error("超时任务自动失败处理异常, orderId={}, taskId={}", order.getId(), order.getTaskId(), e);
             }
         }
 
-        log.info("超时任务自动失败处理完成: 总数={}, 成功={}, 异常={}", timeoutOrders.size(), success, failed);
+        log.info("超时任务自动失败处理完成: 总数={}, 按结果已处理={}, 仍执行中已超时失败={}, 异常={}",
+                timeoutOrders.size(), resultHandled, timeoutFailed, failed);
+    }
+
+    /**
+     * @return true 已按任务最新结果处理(成功或失败);false 仍执行中并已按超时失败处理
+     */
+    private boolean handleTimeoutOrderWithLatestResult(TAiOrderV2 order) {
+        if (order.getTaskId() == null || order.getTaskId().isBlank()) {
+            resultHandler.handleTimeout(order, TIMEOUT_MESSAGE);
+            return false;
+        }
+
+        WorkflowTaskMessage result = workflowTaskClient.getTaskResult(order.getTaskId());
+        if (result == null) {
+            log.warn("超时任务查询结果为空, 按超时失败处理, taskId={}, orderId={}", order.getTaskId(), order.getId());
+            resultHandler.handleTimeout(order, TIMEOUT_MESSAGE);
+            return false;
+        }
+
+        if (resultHandler.handlePolledResult(result)) {
+            return true;
+        }
+
+        resultHandler.handleTimeout(order, TIMEOUT_MESSAGE);
+        return false;
     }
 }