package com.xmzs.midjourney.support; import com.xmzs.midjourney.enums.TaskStatus; import com.xmzs.midjourney.loadbalancer.DiscordLoadBalancer; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; @Slf4j @Component @RequiredArgsConstructor public class TaskTimeoutSchedule { private final DiscordLoadBalancer discordLoadBalancer; @Scheduled(fixedRate = 30000L) public void checkTasks() { this.discordLoadBalancer.getAliveInstances().forEach(instance -> { long timeout = TimeUnit.MINUTES.toMillis(instance.account().getTimeoutMinutes()); List tasks = instance.getRunningTasks().stream() .filter(t -> System.currentTimeMillis() - t.getStartTime() > timeout) .toList(); for (Task task : tasks) { if (Set.of(TaskStatus.FAILURE, TaskStatus.SUCCESS).contains(task.getStatus())) { log.warn("task status is failure/success but is in the queue, end it. id: {}", task.getId()); } else { log.debug("task timeout, id: {}", task.getId()); task.fail("任务超时"); } instance.exitTask(task); } }); } }