From ac852b950111d27d4baaf4fd1e6eab38e21d9953 Mon Sep 17 00:00:00 2001
From: SerLiunx-ctrl <17689543@qq.com>
Date: Sun, 12 Jan 2025 08:49:38 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20ScheduledProvider=E7=8E=B0=E5=8F=AF?=
=?UTF-8?q?=E4=BD=9C=E4=B8=BA=E6=99=AE=E9=80=9A=E4=BB=BB=E5=8A=A1=E6=8F=90?=
=?UTF-8?q?=E4=BA=A4=E8=87=B3=E7=BA=BF=E7=A8=8B=E6=B1=A0.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../support/ipprovider/ScheduledProvider.java | 37 ++++++++++++-------
.../ddns/test/support/ProviderTest.java | 16 ++++++++
2 files changed, 40 insertions(+), 13 deletions(-)
diff --git a/src/main/java/com/serliunx/ddns/support/ipprovider/ScheduledProvider.java b/src/main/java/com/serliunx/ddns/support/ipprovider/ScheduledProvider.java
index d269fbf..13ee8d2 100644
--- a/src/main/java/com/serliunx/ddns/support/ipprovider/ScheduledProvider.java
+++ b/src/main/java/com/serliunx/ddns/support/ipprovider/ScheduledProvider.java
@@ -12,12 +12,13 @@ import java.util.function.Consumer;
/**
* 自动更新的ip供应器
*
异步更新ip, 获取到的ip地址不一定为最新可用的。
+ * 也可作为简单的任务提交到线程池中执行.
*
* @author SerLiunx
* @version 1.0.3
* @since 2024/11/25
*/
-public class ScheduledProvider extends AbstractProvider implements AutoCloseable {
+public class ScheduledProvider extends AbstractProvider implements AutoCloseable, Runnable {
private final Provider internalProvider;
@@ -60,6 +61,11 @@ public class ScheduledProvider extends AbstractProvider implements AutoCloseable
poolExecutor.shutdown();
}
+ @Override
+ public void run() {
+ doAction();
+ }
+
@Override
public String get() {
return internalCache;
@@ -107,18 +113,23 @@ public class ScheduledProvider extends AbstractProvider implements AutoCloseable
* 提交任务逻辑
*/
private void submitTask() {
- task = poolExecutor.scheduleAtFixedRate(() -> {
- // 打断时, 终止已有的任务. (逻辑上不应该发生)
- if (Thread.currentThread().isInterrupted()) {
- log.debug("上一个ip更新任务已终止.");
- return;
- }
- InstanceContextHolder.setAdditional("ip-update");
- internalCache = internalProvider.get().trim();
+ task = poolExecutor.scheduleAtFixedRate(this::doAction, 0, timePeriod, TimeUnit.SECONDS);
+ }
- if (valueConsumer != null) {
- valueConsumer.accept(internalCache);
- }
- }, 0, timePeriod, TimeUnit.SECONDS);
+ /**
+ * 执行逻辑
+ */
+ private void doAction() {
+ // 打断时, 终止已有的任务. (逻辑上不应该发生)
+ if (Thread.currentThread().isInterrupted()) {
+ log.debug("上一个ip更新任务已终止.");
+ return;
+ }
+ InstanceContextHolder.setAdditional("ip-update");
+ internalCache = internalProvider.get().trim();
+
+ if (valueConsumer != null) {
+ valueConsumer.accept(internalCache);
+ }
}
}
diff --git a/src/test/java/com/serliunx/ddns/test/support/ProviderTest.java b/src/test/java/com/serliunx/ddns/test/support/ProviderTest.java
index e7429ac..1710e81 100644
--- a/src/test/java/com/serliunx/ddns/test/support/ProviderTest.java
+++ b/src/test/java/com/serliunx/ddns/test/support/ProviderTest.java
@@ -6,6 +6,10 @@ import com.serliunx.ddns.support.ipprovider.Provider;
import com.serliunx.ddns.support.ipprovider.ScheduledProvider;
import org.junit.Test;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
/**
* 供应器测试
*
@@ -33,4 +37,16 @@ public class ProviderTest {
Provider provider = new IcanhazipProvider();
System.out.println(provider.get());
}
+
+ @Test
+ public void testScheduledProviderForRunnable() throws InterruptedException {
+ ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
+ ScheduledProvider provider = new ScheduledProvider(new IpApiProvider(), 3);
+ provider.close();
+
+ ses.scheduleAtFixedRate(provider, 0, 1000, TimeUnit.MILLISECONDS);
+ provider.whenUpdate(ip -> System.out.println("ip update: " + ip));
+
+ TimeUnit.SECONDS.sleep(120);
+ }
}