Spring WebFlux WebClient зависает, а Mono.timeout не ловит его - PullRequest
0 голосов
/ 24 августа 2018

У меня довольно простой код Kotlin, который всегда блокирует и никогда не возвращает:

WebClient
        .create()
        .get()
        .uri("https://httpbin.org/status/200")
        .exchange()
        .flatMap {
            println("Status ${it.statusCode()}")
            it.bodyToMono(String::class.java)
        }
        .timeout(Duration.ofSeconds(5), Mono.just("fallback"))
        .map { println("Response $it") } // never runs
        .block()
  • httpbin в этом случае не возвращает содержимого (только заголовки), так что это так, чтоbodyToMono вечно ждет контента здесь?Есть ли надежный способ справиться с таким случаем (чтение Content-Length не является надежным)

  • Я установил Mono.timeout со значением отката, почему он не покрывает это?

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

У меня такой же вопрос. Прочитав ответ от Мозга, я думаю, что настоящая проблема все еще не может быть решена. На самом деле нам нужно принять меры для ответа без тела, например, ответ с Mono.just (точно так же, как Артем хочет сделать после тайм-аута). Теперь timeout() не может обработать этот случай, но doOnSuccess(), кажется, также не может обработать этот случай, потому что он будет вызываться либо для тела, либо без тела. В doOnSuccess() мы до сих пор не можем знать, имеет ли clientReponse тело или нет, затем предпринять другие действия.

И, как сказал Брайан ранее, doOn ** имеет побочные эффекты только для использования журнала.

0 голосов
/ 27 августа 2018

В этом случае httpbin.org не возвращает тело ответа, поэтому метод bodyToMono вернет эквивалент Mono.empty().

Если вы измените map { println("Response $it") } (который никогда не запустится, поскольку мы не получаем тело) в doOnSuccess { log.info("Response received") }, печатается сообщение "Response received".

Это означает, что Mono не застрял, он просто завершен с пустым телом.

...