[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.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.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.버전 봄 변경 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.봄 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.여기에 어떻게 내가 해냈어 (감사 @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.봄 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.위의 의견을 바탕으로 당신은 단지 같은 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();
from https://stackoverflow.com/questions/46235512/how-to-set-a-timeout-in-spring-5-webflux-webclient by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 차이 <컨텍스트 : 주석 - 구성> 및 <컨텍스트 : 성분 주사> (0) | 2019.10.23 |
---|---|
[SPRING] 어떻게 UTC 시간대에 봄 부팅 JVM을 강요하는 걸까? (0) | 2019.10.22 |
[SPRING] 자바 - 봄 WS -로드 상대는 XSD 파일에 포함 (톰캣 8) (0) | 2019.10.21 |
[SPRING] 봄은``유형의 하나 이상의 콩이있다, autowire가 없습니다 (0) | 2019.10.19 |
[SPRING] 재귀 thymeleaf 사용하여 메뉴를 렌더링하는 방법 (0) | 2019.10.18 |