diff --git a/scheduler/src/main/java/com/zfoo/scheduler/manager/SchedulerBus.java b/scheduler/src/main/java/com/zfoo/scheduler/manager/SchedulerBus.java index 5420572f..630a3d3f 100644 --- a/scheduler/src/main/java/com/zfoo/scheduler/manager/SchedulerBus.java +++ b/scheduler/src/main/java/com/zfoo/scheduler/manager/SchedulerBus.java @@ -187,4 +187,11 @@ public abstract class SchedulerBus { registerScheduler(SchedulerDefinition.valueOf(cron, runnable)); } + /** + * 立刻执行的任务 + */ + public static void execute(Runnable runnable) { + executor.execute(ThreadUtils.safeRunnable(runnable)); + } + } diff --git a/scheduler/src/main/java/com/zfoo/scheduler/util/SingleCache.java b/scheduler/src/main/java/com/zfoo/scheduler/util/SingleCache.java index ead6d5c0..f30c3e08 100644 --- a/scheduler/src/main/java/com/zfoo/scheduler/util/SingleCache.java +++ b/scheduler/src/main/java/com/zfoo/scheduler/util/SingleCache.java @@ -13,6 +13,9 @@ package com.zfoo.scheduler.util; +import com.zfoo.scheduler.manager.SchedulerBus; + +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; import java.util.function.Supplier; @@ -60,6 +63,18 @@ public class SingleCache { return cache; } + public V lazyGet() { + var now = TimeUtils.now(); + var refreshTime = refreshTimeAtomic.get(); + // 使用双重检测锁的方式 + if (now > refreshTime) { + if (refreshTimeAtomic.compareAndSet(refreshTime, now + refreshDuration)) { + SchedulerBus.execute(() -> cache = supplier.get()); + } + } + return cache; + } + public void set(V value) { cache = value; }