修改BUG spring容器关闭后 遗留 magic-api 线程,导致 JVM 无法关闭

issues: https://gitee.com/ssssssss-team/magic-api/issues/I5BGZ6
This commit is contained in:
jiangqixiang 2024-05-08 16:44:35 +08:00
parent b316c7f725
commit f25b35f576

View File

@ -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<MagicConsoleSession> getSessions() {
return SESSIONS.values();
}