diff --git a/.gitignore b/.gitignore
index e27c09d..b36484b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,6 +12,7 @@ target/
### 测试数据 ###
instances/
settings.properties
+logback.xml
### Eclipse ###
.apt_generated
diff --git a/src/main/java/com/serliunx/ddns/config/Configuration.java b/src/main/java/com/serliunx/ddns/config/Configuration.java
index a814c0e..f52d551 100644
--- a/src/main/java/com/serliunx/ddns/config/Configuration.java
+++ b/src/main/java/com/serliunx/ddns/config/Configuration.java
@@ -1,6 +1,6 @@
package com.serliunx.ddns.config;
-import com.serliunx.ddns.support.Refreshable;
+import com.serliunx.ddns.core.Refreshable;
/**
* 配置信息逻辑定义
diff --git a/src/main/java/com/serliunx/ddns/core/Clearable.java b/src/main/java/com/serliunx/ddns/core/Clearable.java
new file mode 100644
index 0000000..b7681b9
--- /dev/null
+++ b/src/main/java/com/serliunx/ddns/core/Clearable.java
@@ -0,0 +1,23 @@
+package com.serliunx.ddns.core;
+
+/**
+ * 定义一个实体的清理逻辑
+ *
一般用来清理中间加载过程中所产生的无用对象
+ */
+@FunctionalInterface
+public interface Clearable {
+
+ /**
+ * 执行清理
+ */
+ void clear();
+
+ /**
+ * 实体是否需要执行清理逻辑
+ * 默认为真
+ * @return 是否需要执行清理逻辑
+ */
+ default boolean isClearable() {
+ return true;
+ }
+}
diff --git a/src/main/java/com/serliunx/ddns/support/Refreshable.java b/src/main/java/com/serliunx/ddns/core/Refreshable.java
similarity index 55%
rename from src/main/java/com/serliunx/ddns/support/Refreshable.java
rename to src/main/java/com/serliunx/ddns/core/Refreshable.java
index ce9cee7..efec483 100644
--- a/src/main/java/com/serliunx/ddns/support/Refreshable.java
+++ b/src/main/java/com/serliunx/ddns/core/Refreshable.java
@@ -1,4 +1,4 @@
-package com.serliunx.ddns.support;
+package com.serliunx.ddns.core;
/**
* 刷新逻辑
@@ -12,9 +12,4 @@ public interface Refreshable {
* 刷新(初始化)
*/
void refresh();
-
- /**
- * 刷新后逻辑定义, 一般用于资源清理
- */
- default void afterRefresh(){}
}
diff --git a/src/main/java/com/serliunx/ddns/core/context/AbstractInstanceContext.java b/src/main/java/com/serliunx/ddns/core/context/AbstractInstanceContext.java
index 72c9b77..378b09a 100644
--- a/src/main/java/com/serliunx/ddns/core/context/AbstractInstanceContext.java
+++ b/src/main/java/com/serliunx/ddns/core/context/AbstractInstanceContext.java
@@ -1,10 +1,11 @@
package com.serliunx.ddns.core.context;
import com.serliunx.ddns.constant.InstanceType;
+import com.serliunx.ddns.core.Clearable;
import com.serliunx.ddns.core.factory.ListableInstanceFactory;
import com.serliunx.ddns.core.instance.Instance;
import com.serliunx.ddns.support.Assert;
-import com.serliunx.ddns.support.Refreshable;
+import com.serliunx.ddns.core.Refreshable;
import com.serliunx.ddns.util.ReflectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -59,9 +60,6 @@ public abstract class AbstractInstanceContext implements InstanceContext, Multip
Set builtInstances = buildInstances(instances);
instanceMap = builtInstances.stream().collect(Collectors.toMap(Instance::getName, i -> i));
-
- // 调用善后处理钩子函数
- afterRefresh();
}
@Override
@@ -112,10 +110,16 @@ public abstract class AbstractInstanceContext implements InstanceContext, Multip
return listableInstanceFactories;
}
+ @Override
+ public void clear() {
+ if(isClearable())
+ clear0();
+ }
+
/**
- * 善后工作
+ * 子类清理逻辑
*/
- public abstract void afterRefresh();
+ protected abstract void clear0();
/**
* 缓存清理
@@ -125,10 +129,11 @@ public abstract class AbstractInstanceContext implements InstanceContext, Multip
&& !cacheInstanceMap.isEmpty()){
int size = cacheInstanceMap.size();
cacheInstanceMap.clear();
- log.debug("缓存信息清理 => {} 条", size);
+ // 清理实例工厂的缓存信息
+ listableInstanceFactories.forEach(Clearable::clear);
+ listableInstanceFactories.clear();
+ log.info("共清理缓存信息 => {} 条", size);
}
- // 清理实例工厂的缓存信息
- listableInstanceFactories.forEach(Refreshable::afterRefresh);
}
/**
diff --git a/src/main/java/com/serliunx/ddns/core/context/FileInstanceContext.java b/src/main/java/com/serliunx/ddns/core/context/FileInstanceContext.java
index 4ca54c6..e748a32 100644
--- a/src/main/java/com/serliunx/ddns/core/context/FileInstanceContext.java
+++ b/src/main/java/com/serliunx/ddns/core/context/FileInstanceContext.java
@@ -21,7 +21,7 @@ public class FileInstanceContext extends AbstractInstanceContext {
}
@Override
- public void afterRefresh() {
+ protected void clear0() {
clearCache();
}
}
diff --git a/src/main/java/com/serliunx/ddns/core/context/GenericInstanceContext.java b/src/main/java/com/serliunx/ddns/core/context/GenericInstanceContext.java
index a11ef23..b0454ba 100644
--- a/src/main/java/com/serliunx/ddns/core/context/GenericInstanceContext.java
+++ b/src/main/java/com/serliunx/ddns/core/context/GenericInstanceContext.java
@@ -7,8 +7,13 @@ package com.serliunx.ddns.core.context;
*/
public class GenericInstanceContext extends AbstractInstanceContext {
- @Override
- public void afterRefresh() {
- clearCache();
- }
+ @Override
+ protected void clear0() {
+ clearCache();
+ }
+
+ @Override
+ public boolean isClearable() {
+ return false;
+ }
}
diff --git a/src/main/java/com/serliunx/ddns/core/context/InstanceContext.java b/src/main/java/com/serliunx/ddns/core/context/InstanceContext.java
index 8b07bf8..699b723 100644
--- a/src/main/java/com/serliunx/ddns/core/context/InstanceContext.java
+++ b/src/main/java/com/serliunx/ddns/core/context/InstanceContext.java
@@ -1,13 +1,12 @@
package com.serliunx.ddns.core.context;
import com.serliunx.ddns.core.factory.InstanceFactory;
-import com.serliunx.ddns.support.Refreshable;
/**
* @author SerLiunx
* @since 1.0
*/
-public interface InstanceContext extends InstanceFactory, Refreshable {
+public interface InstanceContext extends InstanceFactory {
@Override
default int getPriority() {
diff --git a/src/main/java/com/serliunx/ddns/core/factory/AbstractInstanceFactory.java b/src/main/java/com/serliunx/ddns/core/factory/AbstractInstanceFactory.java
index 0e155f0..56981d3 100644
--- a/src/main/java/com/serliunx/ddns/core/factory/AbstractInstanceFactory.java
+++ b/src/main/java/com/serliunx/ddns/core/factory/AbstractInstanceFactory.java
@@ -17,12 +17,12 @@ import static com.serliunx.ddns.util.InstanceUtils.validateInstance;
*/
public abstract class AbstractInstanceFactory implements InstanceFactory, ListableInstanceFactory {
- private static final Logger log = LoggerFactory.getLogger(AbstractInstanceFactory.class);
+ private final Logger log = LoggerFactory.getLogger(this.getClass());
/**
* 实例信息
*/
- private Map instanceMap;
+ protected Map instanceMap;
@Override
public Instance getInstance(String instanceName) {
@@ -76,13 +76,9 @@ public abstract class AbstractInstanceFactory implements InstanceFactory, Listab
}
@Override
- public void afterRefresh() {
- if (instanceMap != null
- && !instanceMap.isEmpty()){
- int size = instanceMap.size();
- instanceMap.clear();
- log.debug("缓存信息清理 => {} 条", size);
- }
+ public final void clear() {
+ if(isClearable() && instanceMap != null)
+ clear0();
}
/**
@@ -90,4 +86,13 @@ public abstract class AbstractInstanceFactory implements InstanceFactory, Listab
* @return 实例信息
*/
protected abstract Set load();
+
+ /**
+ * 清理逻辑
+ */
+ protected void clear0(){
+ final int size = instanceMap.size();
+ instanceMap.clear();
+ log.info("缓存信息清理 => {} 条", size);
+ }
}
diff --git a/src/main/java/com/serliunx/ddns/core/factory/InstanceFactory.java b/src/main/java/com/serliunx/ddns/core/factory/InstanceFactory.java
index 0e255f4..a2c178a 100644
--- a/src/main/java/com/serliunx/ddns/core/factory/InstanceFactory.java
+++ b/src/main/java/com/serliunx/ddns/core/factory/InstanceFactory.java
@@ -1,14 +1,15 @@
package com.serliunx.ddns.core.factory;
+import com.serliunx.ddns.core.Clearable;
import com.serliunx.ddns.core.Priority;
import com.serliunx.ddns.core.instance.Instance;
-import com.serliunx.ddns.support.Refreshable;
+import com.serliunx.ddns.core.Refreshable;
/**
* @author SerLiunx
* @since 1.0
*/
-public interface InstanceFactory extends Priority, Comparable, Refreshable {
+public interface InstanceFactory extends Priority, Comparable, Refreshable, Clearable {
/**
* 添加实例
diff --git a/src/main/java/com/serliunx/ddns/core/instance/Instance.java b/src/main/java/com/serliunx/ddns/core/instance/Instance.java
index 552c614..3dc1b60 100644
--- a/src/main/java/com/serliunx/ddns/core/instance/Instance.java
+++ b/src/main/java/com/serliunx/ddns/core/instance/Instance.java
@@ -2,7 +2,7 @@ package com.serliunx.ddns.core.instance;
import com.serliunx.ddns.constant.InstanceSource;
import com.serliunx.ddns.constant.InstanceType;
-import com.serliunx.ddns.support.Refreshable;
+import com.serliunx.ddns.core.Refreshable;
/**
* @author SerLiunx
diff --git a/src/main/java/com/serliunx/ddns/support/SystemInitializer.java b/src/main/java/com/serliunx/ddns/support/SystemInitializer.java
index 5e81358..ba3b995 100644
--- a/src/main/java/com/serliunx/ddns/support/SystemInitializer.java
+++ b/src/main/java/com/serliunx/ddns/support/SystemInitializer.java
@@ -2,6 +2,8 @@ package com.serliunx.ddns.support;
import com.serliunx.ddns.config.Configuration;
import com.serliunx.ddns.constant.SystemConstants;
+import com.serliunx.ddns.core.Clearable;
+import com.serliunx.ddns.core.Refreshable;
import com.serliunx.ddns.core.context.MultipleSourceInstanceContext;
import com.serliunx.ddns.core.instance.Instance;
import com.serliunx.ddns.support.feign.client.IPAddressClient;
@@ -33,7 +35,7 @@ import static com.serliunx.ddns.config.ConfigurationKeys.KEY_THREAD_POOL_CORE_SI
* @author SerLiunx
* @since 1.0
*/
-public final class SystemInitializer implements Refreshable {
+public final class SystemInitializer implements Refreshable, Clearable {
private static final Logger log = LoggerFactory.getLogger(SystemInitializer.class);
@@ -79,9 +81,18 @@ public final class SystemInitializer implements Refreshable {
// 运行实例
runInstances();
+
+ // 实例提交后, 清理实例、配置缓存, 因为读取一次就不需要了
+ clear();
log.info("初始化完成!");
}
+ @Override
+ public void clear() {
+ instanceContext.clear();
+ instances.clear();
+ }
+
public MultipleSourceInstanceContext getInstanceContext() {
return instanceContext;
}
@@ -90,11 +101,6 @@ public final class SystemInitializer implements Refreshable {
return instances;
}
- @Override
- public void afterRefresh() {
- // TODO
- }
-
private void loadInstances() {
instances = instanceContext.getInstances();
log.info("载入 {} 个实例.", instances.size());
@@ -166,7 +172,6 @@ public final class SystemInitializer implements Refreshable {
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
MDC.put("pid", SystemSupport.getPid());
log.info("程序正在关闭中, 可能需要一定时间.");
- afterRefresh();
scheduledThreadPoolExecutor.shutdown();
log.info("已关闭.");
}, "DDNS-ShutDownHook"));