延迟后缓存 Mono<>
Cache a Mono<> after a delay
我通过 Mono
以这种方式缓存了一个昂贵的计算:
class Store {
private final Mono<List<Directory>> directories;
public Store(DirectoriesGateway provider) {
directories = Mono.fromCallable(provider::list).cache(Duration.ofMinutes(15);
}
public void process(Request r) {
List<Directory> dirs = directories.block();
// ...
}
}
它在生产中运行良好,但在我们的测试中有一个预热时间。
有没有办法只在延迟后缓存? (比如说 10 秒)
要直接回答问题,您可以使用 takeUntilOther()
然后 switchIfEmpty()
来实现您想要的:
directories = delayCache(Mono.fromCallable(provider::list))
...
public <T> Mono<T> delayCache(Mono<T> mono) {
return mono.takeUntilOther(Mono.delay(Duration.ofSeconds(10)).cache())
.switchIfEmpty(mono.cache(Duration.ofMinutes(15)));
}
但是,请注意 - 这听起来像是一个 XY 问题。我 强烈 建议不要更改在生产中运行良好的代码只是为了让你的测试 运行 好,因为这违背了首先进行测试的意义。
这听起来好像您的测试框架需要一些工作(以某种方式)来消除您所说的 "warming time" 的限制。
我通过 Mono
以这种方式缓存了一个昂贵的计算:
class Store {
private final Mono<List<Directory>> directories;
public Store(DirectoriesGateway provider) {
directories = Mono.fromCallable(provider::list).cache(Duration.ofMinutes(15);
}
public void process(Request r) {
List<Directory> dirs = directories.block();
// ...
}
}
它在生产中运行良好,但在我们的测试中有一个预热时间。
有没有办法只在延迟后缓存? (比如说 10 秒)
要直接回答问题,您可以使用 takeUntilOther()
然后 switchIfEmpty()
来实现您想要的:
directories = delayCache(Mono.fromCallable(provider::list))
...
public <T> Mono<T> delayCache(Mono<T> mono) {
return mono.takeUntilOther(Mono.delay(Duration.ofSeconds(10)).cache())
.switchIfEmpty(mono.cache(Duration.ofMinutes(15)));
}
但是,请注意 - 这听起来像是一个 XY 问题。我 强烈 建议不要更改在生产中运行良好的代码只是为了让你的测试 运行 好,因为这违背了首先进行测试的意义。
这听起来好像您的测试框架需要一些工作(以某种方式)来消除您所说的 "warming time" 的限制。