Несколько тайм-аутов для запроса весны WebFLux - PullRequest
0 голосов
/ 11 января 2019

Привет, я использую webClient из весеннего webflux. у меня есть код вроде:

@Configuration
class WebClientConfig(
    @Value("\${url}")
    private val url: String
) {

    @Bean
    @Primary
    fun webClient(): WebClient {
        return createWebClient(700)
    }

    @Bean("more_timeout")
    fun webClientMoreTimeout(): WebClient {
        return createWebClient(3000)
    }

    private fun createWebClient(timeout: Int): WebClient{
        val httpClient = HttpClient.create()
            .tcpConfiguration { client -> client.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, timeout) }
        return WebClient.builder()
            .baseUrl(url)
            .clientConnector(ReactorClientHttpConnector(httpClient))
            .build()
    }
}

Эта конфигурация потому, что мне нужны звонки с другим таймаутом. Предположим, у меня есть одна служба A, которая очень важна для моего ответа, поэтому я хочу подождать ответа максимум 3 секунды, а также у меня есть другие службы B, C и т. Д., Которые не очень важны для моего ответа, я буду только ждать 700 мс для генерации ответа. Кто я могу архивировать это? Предыдущая конфигурация не работает, потому что webClient является неизменяемым.

1 Ответ

0 голосов
/ 05 февраля 2019

Я думаю, что вы не можете сделать это на уровне webClient, но вы можете сделать это на уровне Reactor, что-то вроде:

 return webClient.post()
        .uri { uriBuilder ->
            uriBuilder.path(PATH)
                .build()
        }
        .body(BodyInserters.fromObject(Request()))
        .accept(MediaType.APPLICATION_JSON_UTF8)
        .exchange()
        .timeout(Duration.ofMillis(1000L))
...