diff --git a/src/main/java/com/serliunx/ddns/constant/SystemConstants.java b/src/main/java/com/serliunx/ddns/constant/SystemConstants.java index 4418d20..b28c1d0 100644 --- a/src/main/java/com/serliunx/ddns/constant/SystemConstants.java +++ b/src/main/java/com/serliunx/ddns/constant/SystemConstants.java @@ -41,6 +41,11 @@ public final class SystemConstants { */ public static final String PROPERTIES_FILE = "settings.properties"; + /** + * 日志配置文件名称 + */ + public static final String LOG_CONFIG_FILE = "logback.xml"; + /** * sqlite */ diff --git a/src/main/java/com/serliunx/ddns/support/SystemInitializer.java b/src/main/java/com/serliunx/ddns/support/SystemInitializer.java index 2d354ac..5e81358 100644 --- a/src/main/java/com/serliunx/ddns/support/SystemInitializer.java +++ b/src/main/java/com/serliunx/ddns/support/SystemInitializer.java @@ -17,8 +17,11 @@ import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.HashMap; import java.util.Map; import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -39,14 +42,14 @@ public final class SystemInitializer implements Refreshable { private ScheduledThreadPoolExecutor scheduledThreadPoolExecutor; private Set instances; - private Map runningInstances; + private final Map> runningInstances = new HashMap<>(64); SystemInitializer(Configuration configuration, MultipleSourceInstanceContext instanceContext) { this.configuration = configuration; this.instanceContext = instanceContext; } - public static Configurer configurer(){ + public static Configurer configurer() { return new Configurer(); } @@ -56,6 +59,8 @@ public final class SystemInitializer implements Refreshable { // 释放配置文件 releaseResource(SystemConstants.PROPERTIES_FILE); + // 释放日志文件 + releaseResource(SystemConstants.LOG_CONFIG_FILE); // 刷新配置信息 configuration.refresh(); @@ -66,6 +71,9 @@ public final class SystemInitializer implements Refreshable { // 初始化线程池 initThreadPool(coreSize); + // 尝试链接dashboard + registerToDashboard(); + // 加载实例(不同的容器加载时机不同) loadInstances(); @@ -92,7 +100,7 @@ public final class SystemInitializer implements Refreshable { log.info("载入 {} 个实例.", instances.size()); } - private void releaseResource(String resourceName){ + private void releaseResource(String resourceName) { ClassLoader classLoader = SystemConstants.class.getClassLoader(); Path path = Paths.get(SystemConstants.USER_DIR + File.separator + resourceName); // 检查文件是否已存在 @@ -106,13 +114,13 @@ public final class SystemInitializer implements Refreshable { OutputStream outputStream = Files.newOutputStream(path); byte[] buffer = new byte[1024]; int bytesRead; - if(inputStream != null){ + if(inputStream != null) { while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } } outputStream.close(); - }catch (Exception e){ + } catch (Exception e) { log.error("文件 {} 解压失败!, 原因: {}", resourceName, e.getMessage()); } } @@ -122,18 +130,20 @@ public final class SystemInitializer implements Refreshable { Assert.notNull(instances); for (Instance i : instances) { - if(!i.validate()){ + if (!i.validate()) { log.error("实例{}({})参数校验不通过, 将不会被运行.", i.getName(), i.getType()); continue; } // 初始化实例 i.refresh(); - scheduledThreadPoolExecutor.scheduleWithFixedDelay(i, 0, i.getInterval(), TimeUnit.SECONDS); + ScheduledFuture future = scheduledThreadPoolExecutor.scheduleWithFixedDelay(i, 0, + i.getInterval(), TimeUnit.SECONDS); + runningInstances.put(i.getName(), future); log.info("{}({})已启动, 运行周期 {} 秒.", i.getName(), i.getType(), i.getInterval()); } } - private void initThreadPool(int coreSize){ + private void initThreadPool(int coreSize) { Assert.isLargerThan(coreSize, 1); scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(coreSize, new TaskThreadFactory()); @@ -146,7 +156,7 @@ public final class SystemInitializer implements Refreshable { IPAddressResponse response = IPAddressClient.instance.getIPAddress(); String ip; if(response != null - && (ip = response.getQuery()) != null){ + && (ip = response.getQuery()) != null) { NetworkContextHolder.setIpAddress(ip); log.info("本机最新公网IP地址 => {}", ip); } @@ -161,4 +171,12 @@ public final class SystemInitializer implements Refreshable { log.info("已关闭."); }, "DDNS-ShutDownHook")); } + + private void registerToDashboard() { + CompletableFuture.runAsync(() -> { + + }, scheduledThreadPoolExecutor).whenComplete((r, t) -> { + + }); + } } diff --git a/src/main/java/com/serliunx/ddns/thread/TaskThreadFactory.java b/src/main/java/com/serliunx/ddns/thread/TaskThreadFactory.java index c0001ef..39764db 100644 --- a/src/main/java/com/serliunx/ddns/thread/TaskThreadFactory.java +++ b/src/main/java/com/serliunx/ddns/thread/TaskThreadFactory.java @@ -23,6 +23,10 @@ public class TaskThreadFactory implements ThreadFactory { MDC.put("pid", SystemSupport.getPid()); r.run(); }; - return new Thread(runnable, String.format("ddns-task-%s", count.getAndIncrement())); + return new Thread(runnable, String.format(getNamePattern(), count.getAndIncrement())); + } + + protected String getNamePattern() { + return "ddns-task-%s"; } } diff --git a/src/main/java/com/serliunx/ddns/thread/UtilThreadFactory.java b/src/main/java/com/serliunx/ddns/thread/UtilThreadFactory.java new file mode 100644 index 0000000..9ef5140 --- /dev/null +++ b/src/main/java/com/serliunx/ddns/thread/UtilThreadFactory.java @@ -0,0 +1,13 @@ +package com.serliunx.ddns.thread; + +/** + * @author SerLiunx + * @since 1.0 + */ +public class UtilThreadFactory extends TaskThreadFactory { + + @Override + protected String getNamePattern() { + return "ddns-util-%s"; + } +} diff --git a/src/test/java/com/serliunx/ddns/test/ContextTest.java b/src/test/java/com/serliunx/ddns/test/ContextTest.java index 7b32afa..d60fe3b 100644 --- a/src/test/java/com/serliunx/ddns/test/ContextTest.java +++ b/src/test/java/com/serliunx/ddns/test/ContextTest.java @@ -1,7 +1,9 @@ package com.serliunx.ddns.test; import com.serliunx.ddns.constant.SystemConstants; +import com.serliunx.ddns.core.context.FileInstanceContext; import com.serliunx.ddns.core.context.GenericInstanceContext; +import com.serliunx.ddns.core.context.MultipleSourceInstanceContext; import com.serliunx.ddns.core.factory.JsonFileInstanceFactory; import com.serliunx.ddns.core.factory.XmlFileInstanceFactory; import com.serliunx.ddns.core.factory.YamlFileInstanceFactory; @@ -14,7 +16,7 @@ import org.junit.Test; public class ContextTest { @Test - public void testContext() { + public void testGenericContext() { GenericInstanceContext genericInstanceContext = new GenericInstanceContext(); genericInstanceContext.addListableInstanceFactory(new XmlFileInstanceFactory(SystemConstants.USER_INSTANCE_DIR)); @@ -24,4 +26,11 @@ public class ContextTest { genericInstanceContext.refresh(); genericInstanceContext.getInstances().forEach(System.out::println); } + + @Test + public void testFileContext(){ + MultipleSourceInstanceContext context = new FileInstanceContext(); + + context.getInstances().forEach(System.out::println); + } }