diff --git a/magic-api-plugins/magic-api-plugin-task/src/main/java/org/ssssssss/magicapi/task/service/TaskMagicDynamicRegistry.java b/magic-api-plugins/magic-api-plugin-task/src/main/java/org/ssssssss/magicapi/task/service/TaskMagicDynamicRegistry.java index f8e93100..0dd56947 100644 --- a/magic-api-plugins/magic-api-plugin-task/src/main/java/org/ssssssss/magicapi/task/service/TaskMagicDynamicRegistry.java +++ b/magic-api-plugins/magic-api-plugin-task/src/main/java/org/ssssssss/magicapi/task/service/TaskMagicDynamicRegistry.java @@ -2,8 +2,10 @@ package org.ssssssss.magicapi.task.service; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.DisposableBean; import org.springframework.context.event.EventListener; import org.springframework.scheduling.TaskScheduler; +import org.springframework.scheduling.concurrent.ExecutorConfigurationSupport; import org.springframework.scheduling.config.CronTask; import org.springframework.scheduling.support.CronTrigger; import org.ssssssss.magicapi.core.config.MagicConfiguration; @@ -16,8 +18,9 @@ import org.ssssssss.magicapi.utils.ScriptManager; import org.ssssssss.script.MagicScriptContext; import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.ThreadPoolExecutor; -public class TaskMagicDynamicRegistry extends AbstractMagicDynamicRegistry { +public class TaskMagicDynamicRegistry extends AbstractMagicDynamicRegistry implements DisposableBean { private final TaskScheduler taskScheduler; @@ -99,4 +102,14 @@ public class TaskMagicDynamicRegistry extends AbstractMagicDynamicRegistry languageProviders, org.ssssssss.magicapi.core.resource.Resource magicResource, diff --git a/magic-api/src/main/java/org/ssssssss/magicapi/core/config/WebSocketSessionManager.java b/magic-api/src/main/java/org/ssssssss/magicapi/core/config/WebSocketSessionManager.java index 1e6d5b58..5b008784 100644 --- a/magic-api/src/main/java/org/ssssssss/magicapi/core/config/WebSocketSessionManager.java +++ b/magic-api/src/main/java/org/ssssssss/magicapi/core/config/WebSocketSessionManager.java @@ -2,6 +2,9 @@ package org.ssssssss.magicapi.core.config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; import org.springframework.web.socket.TextMessage; import org.ssssssss.magicapi.core.event.EventAction; import org.ssssssss.magicapi.core.context.MagicConsoleSession; @@ -17,7 +20,8 @@ import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -public class WebSocketSessionManager { +@Component +public class WebSocketSessionManager implements CommandLineRunner, DisposableBean { private static final Logger logger = LoggerFactory.getLogger(WebSocketSessionManager.class); @@ -43,13 +47,27 @@ public class WebSocketSessionManager { return SESSIONS.get(clientId); } - static { - // 1秒1次发送日志 - new ScheduledThreadPoolExecutor(1, r -> new Thread(r, "magic-api-send-log-task")).scheduleAtFixedRate(WebSocketSessionManager::flushLog, 1, 1, TimeUnit.SECONDS); - // 60秒检测一次是否在线 - new ScheduledThreadPoolExecutor(1, r -> new Thread(r, "magic-api-websocket-clean-task")).scheduleAtFixedRate(WebSocketSessionManager::checkSession, CHECK_INTERVAL, CHECK_INTERVAL, TimeUnit.SECONDS); + private ScheduledThreadPoolExecutor logExecutor; + private ScheduledThreadPoolExecutor wsExecutor; + @Override + public void destroy() { + if (logExecutor != null) { + logExecutor.shutdown(); + } + if (wsExecutor != null) { + wsExecutor.shutdown(); + } } + @Override + public void run(String... args) throws Exception { + // 1秒1次发送日志 + logExecutor = new ScheduledThreadPoolExecutor(1, r -> new Thread(r, "magic-api-send-log-task")); + logExecutor.scheduleAtFixedRate(WebSocketSessionManager::flushLog, 1, 1, TimeUnit.SECONDS); + // 60秒检测一次是否在线 + wsExecutor = new ScheduledThreadPoolExecutor(1, r -> new Thread(r, "magic-api-websocket-clean-task")); + wsExecutor.scheduleAtFixedRate(WebSocketSessionManager::checkSession, CHECK_INTERVAL, CHECK_INTERVAL, TimeUnit.SECONDS); + } public static Collection getSessions() { return SESSIONS.values(); }