延迟后缓存 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" 的限制。