mes-processes/mes-plcSend/src/main/java/com/mes/task/service/TaskExecutionEngine.java
@@ -32,6 +32,8 @@
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import javax.annotation.PreDestroy;
import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -2831,7 +2833,7 @@
            List<TaskStepDetail> largeGlassSteps = taskStepDetailMapper.selectList(
                    Wrappers.<TaskStepDetail>lambdaQuery()
                            .eq(TaskStepDetail::getTaskId, task.getTaskId())
                            .eq(TaskStepDetail::getDeviceId, largeGlassDevice.getId())
                            .eq(TaskStepDetail::getDeviceId, String.valueOf(largeGlassDevice.getId()))
                            .orderByDesc(TaskStepDetail::getStepOrder)
                            .last("LIMIT 1")
            );
@@ -2902,7 +2904,7 @@
            List<TaskStepDetail> transferSteps = taskStepDetailMapper.selectList(
                Wrappers.<TaskStepDetail>lambdaQuery()
                    .eq(TaskStepDetail::getTaskId, taskId)
                    .eq(TaskStepDetail::getDeviceId, transferDevice.getId())
                    .eq(TaskStepDetail::getDeviceId, String.valueOf(transferDevice.getId()))
                    .orderByDesc(TaskStepDetail::getStepOrder)
                    .last("LIMIT 1")
            );
@@ -3154,5 +3156,65 @@
            return summary;
        }
    }
    /**
     * 应用关闭时清理资源
     */
    @PreDestroy
    public void destroy() {
        log.info("开始清理TaskExecutionEngine资源...");
        // 停止所有定时任务
        for (Map.Entry<String, List<ScheduledFuture<?>>> entry : taskScheduledTasks.entrySet()) {
            String taskId = entry.getKey();
            List<ScheduledFuture<?>> futures = entry.getValue();
            if (futures != null) {
                for (ScheduledFuture<?> future : futures) {
                    if (future != null && !future.isDone()) {
                        future.cancel(true);
                    }
                }
            }
            log.debug("已停止任务 {} 的所有定时器", taskId);
        }
        taskScheduledTasks.clear();
        // 关闭定时器线程池
        shutdownExecutor(scheduledExecutor, "定时器线程池");
        // 关闭并行执行线程池
        shutdownExecutor(executorService, "并行执行线程池");
        // 清空运行上下文
        runningTaskContexts.clear();
        log.info("TaskExecutionEngine资源清理完成");
    }
    /**
     * 关闭线程池
     */
    private void shutdownExecutor(ExecutorService executor, String name) {
        if (executor == null || executor.isShutdown()) {
            return;
        }
        executor.shutdown();
        try {
            if (!executor.awaitTermination(10, TimeUnit.SECONDS)) {
                log.warn("{} 在10秒内未能正常关闭,强制关闭", name);
                executor.shutdownNow();
                if (!executor.awaitTermination(5, TimeUnit.SECONDS)) {
                    log.error("{} 强制关闭失败", name);
                }
            } else {
                log.info("{} 已正常关闭", name);
            }
        } catch (InterruptedException e) {
            log.warn("{} 关闭过程中被中断", name, e);
            executor.shutdownNow();
            Thread.currentThread().interrupt();
        }
    }
}