如何解决存在缓存时调用Reactor CacheMono onCacheMissResume
我想使用cachemono并创建一个测试进行评估。因此,我创建了2个单声道并进行了串联。我注意到的是,oncachemissresume
被两个Mono调用,但是在第二个Mono上,未写入缓存。我的考试有什么问题吗?我想使用oncachemissresume
填充缓存,当前的测试结果对我没有帮助。
AtomicReference<Context> storeRef = new AtomicReference<>(Context.empty());
String key = "myid";
Mono<Integer> cachedMonoFirst = CacheMono
.lookup(k -> Mono.justOrEmpty(storeRef.get().<Integer>getOrEmpty(k))
.map(integer -> {
log.error("first :: cache lookup result {}",integer);
return Signal.next(integer);
}),key)
.onCacheMissResume(() -> {
log.info("first :: cache missed ");
return Mono.just(123);})
.andWriteWith((k,sig) -> {
log.info("first :: cache write");
return Mono.fromRunnable(() ->
storeRef.updateAndGet(ctx -> ctx.put(k,sig.get())));});
Mono<Integer> cachedMonoSecond = CacheMono
.lookup(k -> Mono.justOrEmpty(storeRef.get().<Integer>getOrEmpty(k))
.map(integer -> {
log.error("second :: cache lookup result {}",key)
.onCacheMissResume(() -> {
log.error("second :: cache missed");
return Mono.just(456);})
.andWriteWith((k,sig) -> {
log.info("second :: cache write");
return Mono.fromRunnable(() ->
storeRef.updateAndGet(ctx -> ctx.put(k,sig.get())));});
Flux<Integer> cacheFlux = cachedMonoFirst.concatWith(cachedMonoSecond);
StepVerifier
.create(cacheFlux)
.consumeNextWith(data -> {
assertThat(storeRef.get().<Integer>getOrEmpty(key)).get().isEqualTo(data);
log.info(" first :: from cache {} {}",data,storeRef.get().<Integer>getOrEmpty(key));
})
.consumeNextWith(data -> {
assertThat(storeRef.get().<Integer>getOrEmpty(key)).get().isEqualTo(data);
log.info(" second :: from cache {} {}",storeRef.get().<Integer>getOrEmpty(key));
})
.verifyComplete();
日志如下
CacheTest - first :: cache missed
CacheTest - first :: cache write
CacheTest - first :: from cache 123 Optional[123]
CacheTest - second :: cache missed
CacheTest - second :: cache lookup result 123
CacheTest - second :: from cache 123 Optional[123]
为什么second :: cache missed
在second :: cache lookup result 123
之前被调用?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。