Неожиданное поведение при использовании с Mono <Void> - PullRequest
0 голосов
/ 21 июня 2019

При объединении многих Mono<Void> с использованием .then(Mono<Void>) они не работают в ожидаемом порядке.

Может ли кто-нибудь объяснить разницу между рабочим и нерабочим кодом ниже?

Работающийкод

StepVerifier.create(
        repository.incrementCounter(bucket, timeStamp)
                .then(repository.incrementCounter(bucket, timeStamp))
                .then(Mono.just(1).flatMap(t -> repository.resetCounter(bucket, timeStamp)))
                .then(Mono.just(1).flatMap(t -> repository.getCounter(bucket, timeStamp))))
        .expectNext(0L)
        .verifyComplete();

нерабочий

StepVerifier.create(
        repository.incrementCounter(bucket, timeStamp)
                .then(repository.incrementCounter(bucket, timeStamp))
                .then(repository.resetCounter(bucket, timeStamp))
                .then(repository.getCounter(bucket, timeStamp)))
        .expectNext(0L)
        .verifyComplete();

1 Ответ

0 голосов
/ 21 июня 2019

В соответствии с каналом Gitter , ваш репозиторий должен возвращать холодные Mono s (он же "ленивый"), но вы, скорее всего, начинаете вызов даже до его возвращения.

Вы можете использовать Mono.defer, чтобы сделать его холодным.

...