【发布时间】:2019-05-02 17:25:39
【问题描述】:
我的网站上的流量可能会变得很重,我想放慢运行昂贵的清理功能的频率;我也想在后台运行它。
我使用removingListener 实现了一个缓存,并希望它在创建条目后30 秒异步运行,但我发现它要么根本不运行,要么立即运行。当它运行时,我还必须等待清理脚本。我是否误解了缓存和删除侦听器的目的?
@Path("my-endpoint")
public class MyResource{
private static final Cache<String, String> debounceCleaner = CacheBuilder
.newBuilder()
.maximumSize(1000)
.expireAfterWrite(30, TimeUnit.SECONDS)
.removalListener((RemovalListener<String, String>) x-> new Cleaner().clean())
.build();
@PUT
public Response update(){
...
try{
debounceCleaner.get("foo", ()->"bar");
} catch (ExecutionException ex){
throw new IllegalStateException("Unhandled", ex);
}
return Response(...)
【问题讨论】:
-
你在哪里设置缓存?
-
debounceCleaner 是缓存。我发现了一个可能使我重复的问题——我会相应地更新stackoverflow.com/questions/10626720/…
-
Guava 不使用调度线程来处理过期,而是等待它过期并发生其他访问。当有足够的工作堆积时,它会触发维护周期并发送通知。您当然可以使用
ScheduledExecutorService自行安排。 -
谢谢,本。我注意到它在下一次访问时触发,这不是我想要的。我还尝试了您的 Caffeine 包(性能更好),但我违反了编码的基本规则——将包用于不打算用于的东西。