diff --git a/src/main/java/com/serliunx/ddns/support/InstanceContextHolder.java b/src/main/java/com/serliunx/ddns/support/InstanceContextHolder.java index 01bd2d3..b5a6cc4 100644 --- a/src/main/java/com/serliunx/ddns/support/InstanceContextHolder.java +++ b/src/main/java/com/serliunx/ddns/support/InstanceContextHolder.java @@ -10,7 +10,14 @@ import com.serliunx.ddns.core.instance.Instance; */ public final class InstanceContextHolder { + /** + * 当前线程所涉及的实例信息 + */ private static final ThreadLocal INSTANCE_THREAD_LOCAL = new ThreadLocal<>(); + /** + * 当前线程所需要的附加信息 + */ + private static final ThreadLocal ADDITIONAL_INFORMATION_THREAD_LOCAL = new ThreadLocal<>(); private InstanceContextHolder() {throw new UnsupportedOperationException();} @@ -30,10 +37,33 @@ public final class InstanceContextHolder { return INSTANCE_THREAD_LOCAL.get(); } + /** + * 设置附加信息 + * @param additional 附加信息 + */ + public static void setAdditional(String additional) { + ADDITIONAL_INFORMATION_THREAD_LOCAL.set(additional); + } + + /** + * 获取附加信息 + * @return 附加信息 + */ + public static String getAdditional() { + return ADDITIONAL_INFORMATION_THREAD_LOCAL.get(); + } + /** * 清除当前线程的实例信息 */ - public static void clear() { + public static void clearInstance() { INSTANCE_THREAD_LOCAL.remove(); } + + /** + * 清除当前线程的附加信息 + */ + public static void clearAdditional() { + ADDITIONAL_INFORMATION_THREAD_LOCAL.remove(); + } } diff --git a/src/main/java/com/serliunx/ddns/support/SystemInitializer.java b/src/main/java/com/serliunx/ddns/support/SystemInitializer.java index 6b574b4..fc993eb 100644 --- a/src/main/java/com/serliunx/ddns/support/SystemInitializer.java +++ b/src/main/java/com/serliunx/ddns/support/SystemInitializer.java @@ -56,6 +56,7 @@ public final class SystemInitializer implements Refreshable, Clearable { @Override public void refresh() { + InstanceContextHolder.setAdditional("main-refreshing"); log.info("程序正在初始化, 请稍候."); // 检查正在运行的实例信息, 安全的停止(手动刷新时需要执行的逻辑, 初始化不需要) @@ -82,6 +83,7 @@ public final class SystemInitializer implements Refreshable, Clearable { // 实例提交后, 清理实例、配置缓存, 因为读取一次就不需要了 clear(); log.info("初始化完成!"); + InstanceContextHolder.clearAdditional(); } @Override @@ -133,7 +135,7 @@ public final class SystemInitializer implements Refreshable, Clearable { for (Instance i : instances) { if (!i.validate()) { - log.error("实例{}({})参数校验不通过, 将不会被运行.", i.getName(), i.getType()); + log.warn("实例{}({})参数校验不通过, 将不会被运行.", i.getName(), i.getType()); continue; } // 初始化实例 @@ -154,6 +156,7 @@ public final class SystemInitializer implements Refreshable, Clearable { // 提交定时获取网络IP的定时任务 scheduledThreadPoolExecutor.scheduleAtFixedRate(() -> { + InstanceContextHolder.setAdditional("ip-update"); log.info("正在尝试获取本机最新的IP地址."); IPAddressResponse response = IPAddressClient.instance.getIPAddress(); String ip; @@ -162,13 +165,16 @@ public final class SystemInitializer implements Refreshable, Clearable { NetworkContextHolder.setIpAddress(ip); log.info("本机最新公网IP地址 => {}", ip); } + InstanceContextHolder.clearAdditional(); }, 0, configuration.getLong(KEY_TASK_REFRESH_INTERVAL_IP, 300L), TimeUnit.SECONDS); // 添加进程结束钩子函数 Runtime.getRuntime().addShutdownHook(new Thread(() -> { + InstanceContextHolder.setAdditional("stopping"); log.info("程序正在关闭中, 可能需要一定时间."); scheduledThreadPoolExecutor.shutdown(); log.info("已关闭."); + InstanceContextHolder.clearAdditional(); }, "DDNS-ShutDownHook")); }