From 05b637b9f13b876482e54755be6bc8712df7b61b Mon Sep 17 00:00:00 2001 From: SerLiunx-ctrl <17689543@qq.com> Date: Wed, 25 Dec 2024 21:48:01 +0800 Subject: [PATCH] =?UTF-8?q?change:=20=E4=BB=A3=E7=A0=81=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=E3=80=81=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ddns/config/AbstractConfiguration.java | 1 + .../ConfigurationKeys.java | 2 +- .../ddns/core/instance/AliyunInstance.java | 2 +- .../ddns/support/NetworkContextHolder.java | 27 +++++++++++++++- .../ddns/support/SystemInitializer.java | 31 +++++++++++++++++-- .../ddns/support/okhttp/HttpClient.java | 2 +- 6 files changed, 58 insertions(+), 7 deletions(-) rename src/main/java/com/serliunx/ddns/{config => constant}/ConfigurationKeys.java (96%) diff --git a/src/main/java/com/serliunx/ddns/config/AbstractConfiguration.java b/src/main/java/com/serliunx/ddns/config/AbstractConfiguration.java index 16f3f02..f8db3cc 100644 --- a/src/main/java/com/serliunx/ddns/config/AbstractConfiguration.java +++ b/src/main/java/com/serliunx/ddns/config/AbstractConfiguration.java @@ -1,5 +1,6 @@ package com.serliunx.ddns.config; +import com.serliunx.ddns.constant.ConfigurationKeys; import com.serliunx.ddns.support.Assert; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/com/serliunx/ddns/config/ConfigurationKeys.java b/src/main/java/com/serliunx/ddns/constant/ConfigurationKeys.java similarity index 96% rename from src/main/java/com/serliunx/ddns/config/ConfigurationKeys.java rename to src/main/java/com/serliunx/ddns/constant/ConfigurationKeys.java index 515384a..72ab540 100644 --- a/src/main/java/com/serliunx/ddns/config/ConfigurationKeys.java +++ b/src/main/java/com/serliunx/ddns/constant/ConfigurationKeys.java @@ -1,4 +1,4 @@ -package com.serliunx.ddns.config; +package com.serliunx.ddns.constant; /** * 配置文件键常量信息 diff --git a/src/main/java/com/serliunx/ddns/core/instance/AliyunInstance.java b/src/main/java/com/serliunx/ddns/core/instance/AliyunInstance.java index 1b95605..5a15c01 100644 --- a/src/main/java/com/serliunx/ddns/core/instance/AliyunInstance.java +++ b/src/main/java/com/serliunx/ddns/core/instance/AliyunInstance.java @@ -16,7 +16,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -import static com.serliunx.ddns.config.ConfigurationKeys.KEY_ALIYUN_ENDPOINT; +import static com.serliunx.ddns.constant.ConfigurationKeys.KEY_ALIYUN_ENDPOINT; import static com.serliunx.ddns.constant.SystemConstants.XML_ROOT_INSTANCE_NAME; /** diff --git a/src/main/java/com/serliunx/ddns/support/NetworkContextHolder.java b/src/main/java/com/serliunx/ddns/support/NetworkContextHolder.java index 3e7fe8b..75ced85 100644 --- a/src/main/java/com/serliunx/ddns/support/NetworkContextHolder.java +++ b/src/main/java/com/serliunx/ddns/support/NetworkContextHolder.java @@ -5,6 +5,7 @@ import org.slf4j.LoggerFactory; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @@ -24,16 +25,28 @@ public final class NetworkContextHolder { // 外网IP地址获取 private static final Integer IP_CONTEXT_TIME_OUT = 5; private static volatile String IP_ADDRESS; + /** + * 失败计数 + *

+ * 失败次数过多后, 会影响 + */ + private static final AtomicInteger FAILED_COUNTS = new AtomicInteger(); + // private-ctor private NetworkContextHolder() {throw new UnsupportedOperationException();} + /** + * 尝试设置IP地址 + * + * @param i 新的ip地址, 为空时设置会失败 + */ public static void setIpAddress(String i) { if (i == null || i.isEmpty()) { log.error("IP 地址不能为空!"); + FAILED_COUNTS.incrementAndGet(); return; } - try { IP_LOCK.lock(); IP_ADDRESS = i; @@ -41,11 +54,23 @@ public final class NetworkContextHolder { IP_CONTEXT_WAIT_LATCH.countDown(); } } finally { + FAILED_COUNTS.set(0); IP_LOCK.unlock(); } } + /** + * 获取所缓存的ip的地址 + *

+ * 设置失败次数过多时将忽略已保存的缓存值,防止多次将旧IP重复更新. + * + * @return ip地址 + */ public static String getIpAddress() { + if (FAILED_COUNTS.get() > 10) { + log.warn("更新失败次数过多, 不在返回IP地址直到下次成功更新!"); + return null; + } if (IP_ADDRESS != null) { return IP_ADDRESS; } diff --git a/src/main/java/com/serliunx/ddns/support/SystemInitializer.java b/src/main/java/com/serliunx/ddns/support/SystemInitializer.java index 26760dc..a16a3b8 100644 --- a/src/main/java/com/serliunx/ddns/support/SystemInitializer.java +++ b/src/main/java/com/serliunx/ddns/support/SystemInitializer.java @@ -1,7 +1,7 @@ package com.serliunx.ddns.support; import com.serliunx.ddns.config.Configuration; -import com.serliunx.ddns.config.ConfigurationKeys; +import com.serliunx.ddns.constant.ConfigurationKeys; import com.serliunx.ddns.constant.IpProviderType; import com.serliunx.ddns.constant.SystemConstants; import com.serliunx.ddns.core.Clearable; @@ -27,8 +27,8 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import static com.serliunx.ddns.config.ConfigurationKeys.KEY_TASK_REFRESH_INTERVAL_IP; -import static com.serliunx.ddns.config.ConfigurationKeys.KEY_THREAD_POOL_CORE_SIZE; +import static com.serliunx.ddns.constant.ConfigurationKeys.KEY_TASK_REFRESH_INTERVAL_IP; +import static com.serliunx.ddns.constant.ConfigurationKeys.KEY_THREAD_POOL_CORE_SIZE; /** * 系统初始化 @@ -115,11 +115,17 @@ public final class SystemInitializer implements Refreshable, Clearable { return instances; } + /** + * 加载实例(不同的容器加载时机不同) + */ private void loadInstances() { instances = instanceContext.getInstances(); log.info("载入 {} 个实例.", instances.size()); } + /** + * 资源释放 + */ @SuppressWarnings("SameParameterValue") private void releaseResource(String resourceName) { ClassLoader classLoader = SystemConstants.class.getClassLoader(); @@ -146,6 +152,9 @@ public final class SystemInitializer implements Refreshable, Clearable { } } + /** + * 运行实例 + */ private void runInstances() { Assert.notNull(scheduledThreadPoolExecutor); Assert.notNull(instances); @@ -164,6 +173,11 @@ public final class SystemInitializer implements Refreshable, Clearable { } } + /** + * 初始化线程池 + * + * @param coreSize 线程池核心线程数量 + */ private void initThreadPool(int coreSize) { Assert.isLargerThan(coreSize, 1); scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(coreSize, ThreadFactoryBuilder.builder() @@ -182,6 +196,9 @@ public final class SystemInitializer implements Refreshable, Clearable { }, "DDNS-ShutDownHook")); } + /** + * 初始化定时获取IP地址的任务 + */ private void initIpTask() { scheduledProvider = new ScheduledProvider(getInternalProvider(), configuration.getLong(KEY_TASK_REFRESH_INTERVAL_IP, 300L)); @@ -192,11 +209,19 @@ public final class SystemInitializer implements Refreshable, Clearable { }); } + /** + * 获取内置的IP供应器(获取IP地址的方式) + *

+ * 根据配置文件中的定义{@link ConfigurationKeys#KEY_IP_PROVIDER_TYPE}, 默认为{@link com.serliunx.ddns.support.ipprovider.IpApiProvider} + */ private Provider getInternalProvider() { return configuration.getEnum(IpProviderType.class, ConfigurationKeys.KEY_IP_PROVIDER_TYPE, IpProviderType.IP_API).getProvider(); } + /** + * 关闭线程池逻辑 + */ private void checkAndCloseSafely() { if (scheduledThreadPoolExecutor == null) return; diff --git a/src/main/java/com/serliunx/ddns/support/okhttp/HttpClient.java b/src/main/java/com/serliunx/ddns/support/okhttp/HttpClient.java index 787a12b..7f3f99f 100644 --- a/src/main/java/com/serliunx/ddns/support/okhttp/HttpClient.java +++ b/src/main/java/com/serliunx/ddns/support/okhttp/HttpClient.java @@ -1,7 +1,7 @@ package com.serliunx.ddns.support.okhttp; import com.serliunx.ddns.config.Configuration; -import com.serliunx.ddns.config.ConfigurationKeys; +import com.serliunx.ddns.constant.ConfigurationKeys; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response;