복붙노트

[SPRING] 봄 5 WebFlux의 웹 클라이언트 시간 제한을 설정하는 방법

SPRING

봄 5 WebFlux의 웹 클라이언트 시간 제한을 설정하는 방법

내 웹 클라이언트에 제한 시간을 설정하기 위해 노력하고있어, 여기에 현재 코드는 다음과 같습니다

SslContext sslContext = SslContextBuilder.forClient().trustManager(InsecureTrustManagerFactory.INSTANCE).build();

ClientHttpConnector httpConnector = new ReactorClientHttpConnector(opt -> {
    opt.sslContext(sslContext);
    HttpClientOptions option = HttpClientOptions.builder().build();
    opt.from(option);
});
return WebClient.builder().clientConnector(httpConnector).defaultHeader("Authorization", xxxx)
                .baseUrl(this.opusConfig.getBaseURL()).build();

나는 시간 제한을 추가 할 필요도 내가 그런 걸 생각하고 있었는데, 전략을 풀링 :

PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(this.applicationConfig.getHttpClientMaxPoolSize());
cm.setDefaultMaxPerRoute(this.applicationConfig.getHttpClientMaxPoolSize());
cm.closeIdleConnections(this.applicationConfig.getServerIdleTimeout(), TimeUnit.MILLISECONDS);

RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(this.applicationConfig.getHttpClientSocketTimeout())
        .setConnectTimeout(this.applicationConfig.getHttpClientConnectTimeout())
        .setConnectionRequestTimeout(this.applicationConfig.getHttpClientRequestTimeout()).build();

CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).setConnectionManager(cm).build();

하지만 내 웹 클라이언트에서 세션 객체를 설정하는 방법을 알아낼 수 없습니다

해결법

  1. ==============================

    1.WebFlux 웹 클라이언트는 아파치 코 몬즈 HTTP 클라이언트를 사용하지 않습니다. 사용자 지정 ClientHttpConnector를 통해 하나 개의 솔루션을 구현할 수있을 수도 있지만. 기존 ReactorClientHttpConnector은 그물코를 기반으로합니다. 따라서, 예컨대을 클라이언트를 구성 인 Netty 옵션을 사용하여 생각 :

    WebFlux 웹 클라이언트는 아파치 코 몬즈 HTTP 클라이언트를 사용하지 않습니다. 사용자 지정 ClientHttpConnector를 통해 하나 개의 솔루션을 구현할 수있을 수도 있지만. 기존 ReactorClientHttpConnector은 그물코를 기반으로합니다. 따라서, 예컨대을 클라이언트를 구성 인 Netty 옵션을 사용하여 생각 :

    ReactorClientHttpConnector connector =
                new ReactorClientHttpConnector(options ->
                        options.option(ChannelOption.SO_TIMEOUT, this.applicationConfig.getHttpClientConnectTimeout()));
    

    또는

    .onChannelInit(channel -> channel.config().setConnectTimeoutMillis(this.applicationConfig.getHttpClientConnectTimeout()))
    

    최신 정보

    우리는 또한 ReadTimeoutHandler을 사용할 수 있습니다 :

    .onChannelInit(channel -> 
            channel.pipeline()
               .addLast(new ReadTimeoutHandler(this.applicationConfig.getHttpClientConnectTimeout())))
    
  2. ==============================

    2.SO_TIMEOUT 옵션 NIO를 사용하여 채널을 사용할 수 없기 때문에, 읽기를 설정하고 나는 아래의 방법을 사용 시간 제한을 연결하려면 (그리고 경고 알 수없는 채널 옵션 'SO_TIMEOUT'채널을 제공하는 '[ID : 0xa716fcb2]')

    SO_TIMEOUT 옵션 NIO를 사용하여 채널을 사용할 수 없기 때문에, 읽기를 설정하고 나는 아래의 방법을 사용 시간 제한을 연결하려면 (그리고 경고 알 수없는 채널 옵션 'SO_TIMEOUT'채널을 제공하는 '[ID : 0xa716fcb2]')

    ReactorClientHttpConnector connector = new ReactorClientHttpConnector(
              options -> options.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 2000)
                                .compression(true)
                                .afterNettyContextInit(ctx -> {
                                    ctx.addHandlerLast(new ReadTimeoutHandler(5000, TimeUnit.MILLISECONDS));
                                }));
    return WebClient.builder()
                    .clientConnector(connector)
                    .build();
    
  3. ==============================

    3.버전 봄 변경 ReactorClientHttpConnector의 API 5.1 WebFlux.

    버전 봄 변경 ReactorClientHttpConnector의 API 5.1 WebFlux.

    그래서 (@joshiste 예에 따라, 코 틀린 구문) 다음을 수행합니다 :

    val tcpClient = TcpClient.create()
        .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10_000)
        .doOnConnected { connection ->
            connection.addHandlerLast(ReadTimeoutHandler(10))
                .addHandlerLast(WriteTimeoutHandler(10))
        }
    
    val myWebClient = WebClient.builder()
        .clientConnector(ReactorClientHttpConnector(HttpClient.from(tcpClient)))
        .baseUrl(myEndPoint)
        .build()
    
  4. ==============================

    4.봄 Webflux가 업데이트되면서, 여기 (코 틀린에 대한 답변에 따라) 자바에 대해 작동하는 솔루션입니다 :

    봄 Webflux가 업데이트되면서, 여기 (코 틀린에 대한 답변에 따라) 자바에 대해 작동하는 솔루션입니다 :

    TcpClient timeoutClient = TcpClient.create()
        .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, SECONDS*1000)
        .doOnConnected(
            c -> c.addHandlerLast(new ReadTimeoutHandler(SECONDS))
                  .addHandlerLast(new WriteTimeoutHandler(SECONDS)));
    return webClientBuilder.baseUrl(YOUR_URL)
           .clientConnector(new ReactorClientHttpConnector(HttpClient.from(timeoutClient)))
           .build();
    
  5. ==============================

    5.여기에 어떻게 내가 해냈어 (감사 @Artem합니다)

    여기에 어떻게 내가 해냈어 (감사 @Artem합니다)

    SslContext sslContext = SslContextBuilder.forClient().trustManager(InsecureTrustManagerFactory.INSTANCE).build();
    
            ClientHttpConnector httpConnector = new ReactorClientHttpConnector(options -> {
                options.sslContext(sslContext);
                options.option(ChannelOption.SO_TIMEOUT, this.applicationConfig.getHttpClientRequestTimeout());
                options.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, this.applicationConfig.getHttpClientConnectTimeout());
                options.poolResources(PoolResources.fixed("myPool", this.applicationConfig.getHttpClientMaxPoolSize()));
            });
    
            return WebClient.builder().clientConnector(httpConnector).defaultHeader("Authorization", "xxxx")
                    .baseUrl(this.config.getBaseURL()).build();
    
  6. ==============================

    6.봄 Webflux 5.1.8으로 나는 웹 클라이언트를 사용하여 여러 후속 테스트를 실행할 때 mcoolive에서 답을 이용하여 아래의 오류 메시지를 산출 문제로 달렸다.

    봄 Webflux 5.1.8으로 나는 웹 클라이언트를 사용하여 여러 후속 테스트를 실행할 때 mcoolive에서 답을 이용하여 아래의 오류 메시지를 산출 문제로 달렸다.

    공급자와 루프 자원이 내 문제를 해결 연결을 추가 :

    final ConnectionProvider theTcpClientPool = ConnectionProvider.elastic("tcp-client-pool");
    final LoopResources theTcpClientLoopResources = LoopResources.create("tcp-client-loop");
    
    final TcpClient theTcpClient = TcpClient
        .create(theTcpClientPool)
        .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
        .runOn(theTcpClientLoopResources)
        .doOnConnected(theConnection -> {
            theConnection.addHandlerLast(new ReadTimeoutHandler(mTimeoutInMillisec, TimeUnit.MILLISECONDS));
            theConnection.addHandlerLast(new WriteTimeoutHandler(mTimeoutInMillisec, TimeUnit.MILLISECONDS));
        });
    
    WebClient theWebClient = WebClient.builder()
        .baseUrl(mVfwsServerBaseUrl)
        .clientConnector(new ReactorClientHttpConnector(HttpClient.from(theTcpClient)))
        .build();
    
  7. ==============================

    7.위의 의견을 바탕으로 당신은 단지 같은 timeoutClient의 또 다른 옵션으로 추가 소켓 시간 초과를 추가합니다.

    위의 의견을 바탕으로 당신은 단지 같은 timeoutClient의 또 다른 옵션으로 추가 소켓 시간 초과를 추가합니다.

    TcpClient timeoutClient = TcpClient.create()
        .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, SECONDS*10) //Connect Timeout
        .option(ChannelOption.SO_TIMEOUT,1000) // Socket Timeout
        .doOnConnected(
            c -> c.addHandlerLast(new ReadTimeoutHandler(SECONDS))
                  .addHandlerLast(new WriteTimeoutHandler(SECONDS)));
    return webClientBuilder.baseUrl(YOUR_URL)
           .clientConnector(new ReactorClientHttpConnector(HttpClient.from(timeoutClient)))
           .build();
    
  8. from https://stackoverflow.com/questions/46235512/how-to-set-a-timeout-in-spring-5-webflux-webclient by cc-by-sa and MIT license