请求弹簧WebFLux的多个超时

时间:2019-01-11 15:53:11

标签: spring kotlin netty webclient spring-webflux

您好,我使用的是Spring Webflux的webClient。我有一些类似的代码:

@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秒钟,并且假设y有另一个服务B,C等,这对我的响应不是很重要,我只会等待700ms生成响应。我可以将谁存档? 先前的配置无法正常工作,因为webClient是不可变的。

1 个答案:

答案 0 :(得分:0)

我认为您无法在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))