现象

与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);

这种错误在并发下会偶现,目前使用这种方式修改正在观察中….. 后续如果有错误再反馈上…


版权声明:本文为cainiao1412原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/cainiao1412/article/details/130059160