🐛 修复 CacheUtils 异步缓存的 ThreadLocal 变量传递

This commit is contained in:
YunaiV 2023-12-30 11:59:16 +08:00
parent a7fcf268cf
commit c98738d405

View File

@ -1,10 +1,12 @@
package cn.iocoder.yudao.framework.common.util.cache; package cn.iocoder.yudao.framework.common.util.cache;
import com.alibaba.ttl.threadpool.TtlExecutors;
import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader; import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache; import com.google.common.cache.LoadingCache;
import java.time.Duration; import java.time.Duration;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
/** /**
@ -15,11 +17,13 @@ import java.util.concurrent.Executors;
public class CacheUtils { public class CacheUtils {
public static <K, V> LoadingCache<K, V> buildAsyncReloadingCache(Duration duration, CacheLoader<K, V> loader) { public static <K, V> LoadingCache<K, V> buildAsyncReloadingCache(Duration duration, CacheLoader<K, V> loader) {
Executor executor = Executors.newCachedThreadPool( // TODO 芋艿可能要思考下未来要不要做成可配置
TtlExecutors.getDefaultDisableInheritableThreadFactory()); // TTL 保证 ThreadLocal 可以透传
return CacheBuilder.newBuilder() return CacheBuilder.newBuilder()
// 只阻塞当前数据加载线程其他线程返回旧值 // 只阻塞当前数据加载线程其他线程返回旧值
.refreshAfterWrite(duration) .refreshAfterWrite(duration)
// 通过 asyncReloading 实现全异步加载包括 refreshAfterWrite 被阻塞的加载线程 // 通过 asyncReloading 实现全异步加载包括 refreshAfterWrite 被阻塞的加载线程
.build(CacheLoader.asyncReloading(loader, Executors.newCachedThreadPool())); // TODO 芋艿可能要思考下未来要不要做成可配置 .build(CacheLoader.asyncReloading(loader, executor));
} }
} }