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); + } }