|
@@ -72,4 +72,40 @@ public class WorkflowTaskScheduler {
|
|
|
log.info("轮询超时任务完成: 总数={}, 已处理={}, 仍执行中={}, 异常={}",
|
|
log.info("轮询超时任务完成: 总数={}, 已处理={}, 仍执行中={}, 异常={}",
|
|
|
pendingOrders.size(), processed, stillRunning, failed);
|
|
pendingOrders.size(), processed, stillRunning, failed);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 每10分钟检测一次:将创建时间超过20分钟且仍处于"执行中"的任务标记为超时失败,
|
|
|
|
|
+ * 自动退款并标记相册失败。
|
|
|
|
|
+ */
|
|
|
|
|
+ @Scheduled(fixedRate = 10 * 60 * 1000, initialDelay = 2 * 60 * 1000)
|
|
|
|
|
+ @SchedulerLock(name = "autoFailTimeoutTasks", lockAtMostFor = "PT10M", lockAtLeastFor = "PT1M")
|
|
|
|
|
+ public void autoFailTimeoutTasks() {
|
|
|
|
|
+ LocalDateTime timeoutThreshold = LocalDateTime.now().minusMinutes(20);
|
|
|
|
|
+ List<TAiOrderV2> timeoutOrders = aiOrderV2Service.list(
|
|
|
|
|
+ new LambdaQueryWrapper<TAiOrderV2>()
|
|
|
|
|
+ .eq(TAiOrderV2::getTaskStatus, 1)
|
|
|
|
|
+ .le(TAiOrderV2::getCreateTime, timeoutThreshold)
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ if (timeoutOrders.isEmpty()) {
|
|
|
|
|
+ log.debug("无超时需自动失败的任务");
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ log.info("开始处理超时任务自动失败, 共{}条", timeoutOrders.size());
|
|
|
|
|
+ int success = 0;
|
|
|
|
|
+ int failed = 0;
|
|
|
|
|
+
|
|
|
|
|
+ for (TAiOrderV2 order : timeoutOrders) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ resultHandler.handleTimeout(order, "任务执行超时(超过20分钟),系统自动标记失败");
|
|
|
|
|
+ success++;
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ failed++;
|
|
|
|
|
+ log.error("超时任务自动失败处理异常, orderId={}, taskId={}", order.getId(), order.getTaskId(), e);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ log.info("超时任务自动失败处理完成: 总数={}, 成功={}, 异常={}", timeoutOrders.size(), success, failed);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|