Кэшировать моно <> после задержки - PullRequest
1 голос
/ 17 октября 2019

У меня есть дорогостоящие вычисления, которые кэшируются с помощью 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 секунд)

1 Ответ

3 голосов
/ 18 октября 2019

Чтобы ответить на вопрос напрямую, вы можете использовать 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. Я бы настоятельно посоветовал бы не менять код, который хорошо работает в производственном процессе, просто для того, чтобы ваши тесты работали хорошо, поскольку это не подкрепляет необходимость иметь тесты во-первых. как будто вашей тестовой среде нужна определенная работа (так или иначе), чтобы снять ограничение на «время потепления», о котором вы говорите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...