feat: ScheduledProvider现可作为普通任务提交至线程池.
This commit is contained in:
@@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user