From 4addf115436a6f99a93241f1baa929b30ba556e0 Mon Sep 17 00:00:00 2001 From: jaysunxiao Date: Sat, 5 Jul 2025 08:59:23 +0800 Subject: [PATCH] perf[cache]: use EventBus in SingleCache to avoid single scheduler thread blocking --- scheduler/pom.xml | 6 +++++ .../com/zfoo/scheduler/util/SingleCache.java | 23 ++++++++++++------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/scheduler/pom.xml b/scheduler/pom.xml index 3100b1b5..6423b38b 100644 --- a/scheduler/pom.xml +++ b/scheduler/pom.xml @@ -57,6 +57,12 @@ ${zfoo.version} + + com.zfoo + event + ${zfoo.version} + + org.javassist javassist 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 af4da2a1..171870b7 100644 --- a/scheduler/src/main/java/com/zfoo/scheduler/util/SingleCache.java +++ b/scheduler/src/main/java/com/zfoo/scheduler/util/SingleCache.java @@ -13,9 +13,8 @@ package com.zfoo.scheduler.util; -import com.zfoo.scheduler.manager.SchedulerBus; +import com.zfoo.event.manager.EventBus; -import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; import java.util.function.Supplier; @@ -35,6 +34,11 @@ public class SingleCache { private AtomicLong refreshTimeAtomic; + private SingleCache(long refreshDuration, Supplier supplier) { + this.refreshDuration = refreshDuration; + this.supplier = supplier; + this.refreshTimeAtomic = new AtomicLong(TimeUtils.now() + refreshDuration); + } /** * @param refreshDuration 刷新实际那,毫秒 @@ -42,11 +46,14 @@ public class SingleCache { * @return 简单的缓存 */ public static SingleCache build(long refreshDuration, Supplier supplier) { - var cache = new SingleCache(); - cache.refreshDuration = refreshDuration; - cache.supplier = supplier; - cache.refreshTimeAtomic = new AtomicLong(TimeUtils.now() + refreshDuration); - SchedulerBus.execute(() -> cache.cache = supplier.get()); + var cache = new SingleCache(refreshDuration, supplier); + cache.cache = supplier.get(); + return cache; + } + + public static SingleCache lazyBuild(long refreshDuration, Supplier supplier) { + var cache = new SingleCache(refreshDuration, supplier); + EventBus.asyncExecute(cache.hashCode(), () -> cache.cache = supplier.get()); return cache; } @@ -69,7 +76,7 @@ public class SingleCache { // 使用双重检测锁的方式 if (now > refreshTime) { if (refreshTimeAtomic.compareAndSet(refreshTime, now + refreshDuration)) { - SchedulerBus.execute(() -> cache = supplier.get()); + EventBus.asyncExecute(cache.hashCode(), () -> cache = supplier.get()); } } return cache;