Merge remote-tracking branch 'origin/master'

This commit is contained in:
2025-01-15 15:23:54 +08:00
2 changed files with 40 additions and 13 deletions

View File

@@ -12,12 +12,13 @@ import java.util.function.Consumer;
/** /**
* 自动更新的ip供应器 * 自动更新的ip供应器
* <li> 异步更新ip, 获取到的ip地址不一定为最新可用的。 * <li> 异步更新ip, 获取到的ip地址不一定为最新可用的。
* <li> 也可作为简单的任务提交到线程池中执行.
* *
* @author <a href="mailto:serliunx@yeah.net">SerLiunx</a> * @author <a href="mailto:serliunx@yeah.net">SerLiunx</a>
* @version 1.0.3 * @version 1.0.3
* @since 2024/11/25 * @since 2024/11/25
*/ */
public class ScheduledProvider extends AbstractProvider implements AutoCloseable { public class ScheduledProvider extends AbstractProvider implements AutoCloseable, Runnable {
private final Provider internalProvider; private final Provider internalProvider;
@@ -60,6 +61,11 @@ public class ScheduledProvider extends AbstractProvider implements AutoCloseable
poolExecutor.shutdown(); poolExecutor.shutdown();
} }
@Override
public void run() {
doAction();
}
@Override @Override
public String get() { public String get() {
return internalCache; return internalCache;
@@ -107,7 +113,13 @@ public class ScheduledProvider extends AbstractProvider implements AutoCloseable
* 提交任务逻辑 * 提交任务逻辑
*/ */
private void submitTask() { private void submitTask() {
task = poolExecutor.scheduleAtFixedRate(() -> { task = poolExecutor.scheduleAtFixedRate(this::doAction, 0, timePeriod, TimeUnit.SECONDS);
}
/**
* 执行逻辑
*/
private void doAction() {
// 打断时, 终止已有的任务. (逻辑上不应该发生) // 打断时, 终止已有的任务. (逻辑上不应该发生)
if (Thread.currentThread().isInterrupted()) { if (Thread.currentThread().isInterrupted()) {
log.debug("上一个ip更新任务已终止."); log.debug("上一个ip更新任务已终止.");
@@ -119,6 +131,5 @@ public class ScheduledProvider extends AbstractProvider implements AutoCloseable
if (valueConsumer != null) { if (valueConsumer != null) {
valueConsumer.accept(internalCache); valueConsumer.accept(internalCache);
} }
}, 0, timePeriod, TimeUnit.SECONDS);
} }
} }

View File

@@ -6,6 +6,10 @@ import com.serliunx.ddns.support.ipprovider.Provider;
import com.serliunx.ddns.support.ipprovider.ScheduledProvider; import com.serliunx.ddns.support.ipprovider.ScheduledProvider;
import org.junit.Test; 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(); Provider provider = new IcanhazipProvider();
System.out.println(provider.get()); 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);
}
} }