Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -12,12 +12,13 @@ import java.util.function.Consumer;
|
||||
/**
|
||||
* 自动更新的ip供应器
|
||||
* <li> 异步更新ip, 获取到的ip地址不一定为最新可用的。
|
||||
* <li> 也可作为简单的任务提交到线程池中执行.
|
||||
*
|
||||
* @author <a href="mailto:serliunx@yeah.net">SerLiunx</a>
|
||||
* @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,7 +113,13 @@ public class ScheduledProvider extends AbstractProvider implements AutoCloseable
|
||||
* 提交任务逻辑
|
||||
*/
|
||||
private void submitTask() {
|
||||
task = poolExecutor.scheduleAtFixedRate(() -> {
|
||||
task = poolExecutor.scheduleAtFixedRate(this::doAction, 0, timePeriod, TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行逻辑
|
||||
*/
|
||||
private void doAction() {
|
||||
// 打断时, 终止已有的任务. (逻辑上不应该发生)
|
||||
if (Thread.currentThread().isInterrupted()) {
|
||||
log.debug("上一个ip更新任务已终止.");
|
||||
@@ -119,6 +131,5 @@ public class ScheduledProvider extends AbstractProvider implements AutoCloseable
|
||||
if (valueConsumer != null) {
|
||||
valueConsumer.accept(internalCache);
|
||||
}
|
||||
}, 0, timePeriod, TimeUnit.SECONDS);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user