现象
与reactor mono一起使用,发现get key时,返回的一直都是抛出的错误信息,没有预期中的如果cache loader 返回null 或 错误时,caffeine自动剔除key,重新加载,而是将一次cache loader返回的错误future记录下来了,后续每次都是返回这个错误future。
处理
参考了一个下这个issue,其中有一段推荐使用的代码AsyncLoadingCaches will cache Mono's in error. · Issue #260 · ben-manes/caffeine · GitHub
public static <KEY, VALUE> Mono<VALUE> lookupAndWrite2(
AsyncLoadingCache<KEY, VALUE> cache, KEY key, Mono<VALUE> mono) {
return Mono.defer(() -> Mono.fromFuture(cache.get(key, (k, e) -> {
CompletableFuture<VALUE> future = mono.toFuture();
return future.whenCompleteAsync((r, t) -> {
if (t != null) {
cache.synchronous().invalidate(key);
}
}, e);
})));
}
主要是这个,使用whenCompleteAsync判断返回的结果有没有错误,如果有错误,强制剔除一下 cache.synchronous().invalidate(key); ,把有错误的key剔除掉。
future.whenCompleteAsync((r, t) -> {
if (t != null) {
cache.synchronous().invalidate(key);
}
}, e);
这种错误在并发下会偶现,目前使用这种方式修改正在观察中..... 后续如果有错误再反馈上...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)