急切地缓存单声道

Eagerly caching Mono

我急切地希望缓存 Reactor Mono 的结果。它计划每 10 分钟在缓存中更新一次,但由于仅在订阅时才评估 Mono,因此该任务实际上不会刷新缓存。

示例:

@Scheduled(fixedRate = 10 * 60 * 1000 + 3000)
fun getMessage(): Mono<String> {
    return Mono.just("Hello")
            .map { it.toUpperCase() }
            .cache(Duration.ofMinutes(10))
}

您需要将 Mono 存储在某处,否则每次调用方法(通过 Scheduled 或直接调用)都会 return 一个不同的实例。

也许作为伴生对象?

以下是我在 Java 中天真的做法:

protected Mono<String> cached;

//for the scheduler to periodically eagerly refresh the cache
@Scheduled(fixedRate = 10 * 60 * 1000 + 3000)
void refreshCache() {
    this.cached = Mono.just("Hello")
            .map { it.toUpperCase() }
            .cache(Duration.ofMinutes(10));
    this.cached.subscribe(v -> {}, e -> {}); //swallows errors during refresh
}

//for users
public Mono<String> getMessage() {
    return this.cached;
}