Тайм-аут Webflux для сети Mono - PullRequest
       9

Тайм-аут Webflux для сети Mono

0 голосов
/ 23 сентября 2019

Я использую Spring Webflux и пытаюсь понять концепцию тайм-аута для цепочки Monos.

Например, есть цепочка звонков Mono:

myService.firstOperation()
.then(myService.secondOperation())
...
.then(myService.nOperation())
.timeout(3000L)

Как происходит тайм-аутбудет применяться:

1) Для общих операций (суммарное время операций)

2) Для операций ech (каждая операция не должна превышать тайм-аут)

3) Только для последней операции (nOperation)

?

Я почти уверен, что тайм-аут применяется к последнему издателю.Если да, то как можно применить тайм-аут к сумме операций?

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Оператор времени ожидания измеряет время, прошедшее между временем подписки и сигналом onNext / onComplete, наблюдаемым оператором времени ожидания.

Рассмотрим следующий пример:

Mono.delay(Duration.ofMillis(1000))
    .then(Mono.delay(Duration.ofMillis(1000)))
    .then(Mono.delay(Duration.ofMillis(1000)))
    .timeout(Duration.ofMillis(2500))
    .block();

If, оператор 2(время, измеренное между операциями) или 3 (только продолжительность последних операций) были правильными, тогда приведенный выше фрагмент кода не выдавал бы никакой ошибки.

Однако в этом случае операция тайм-аута измеряет продолжительностьвсего восходящего потока, что составляет оператор 1 (сумма всех измеренных операций). ПРАВИЛЬНО .

В примере сумма всех операций (1000 + 1000 + 1000 = 3000 мс) больше, чем сконфигурированнаявремя ожидания (2500 мс), поэтому код приводит к ошибке.

0 голосов
/ 24 сентября 2019

Документация довольно ясна

timeout - время ожидания до сигнала onNext от this Mono

Так что в вашем примере время ожидания толькоприменяется к Моно, возвращенному из последней then.

.then( ... )
.timeout(3000L)

правильный ответ:

3) Только для последней операции (nOperation)

Так как это последний в цепочке.

Нет тайм-аута для суммы операций, зачем вам это нужно?

...