我正在尝试在我的WebClient上设置超时,以下是当前代码:
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();
但是我不知道如何在我的webclient中设置httpClient
随着Spring WebFlow的更新,这里有一个适用于Java的解决方案(基于静态编程语言的答案):
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();
更新2021
因为HttpClient.from(TcpClient)
被弃用了,所以现在更容易了:
return WebClient.builder()
.baseUrl(YOUR_URL)
.clientConnector(new ReactorClientHttpConnector(HttpClient.create()
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, SECONDS * 1000)
.doOnConnected(c -> c.addHandlerLast(new ReadTimeoutHandler(SECONDS))
.addHandlerLast(new WriteTimeoutHandler(SECONDS)))))
.build();
Spring WebFlux 5.1版中的ReactorClientHttpConnector API已更改。
因此,我执行以下操作(Kotlin语法,基于@joshiste示例):
val tcpClient = TcpClient.create()
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10_000)
.doOnConnected { connection ->
connection.addHandlerLast(ReadTimeoutHandler(10))
.addHandlerLast(WriteTimeoutHandler(10))
}
val myWebClient = webClientBuilder
.clientConnector(ReactorClientHttpConnector(HttpClient.from(tcpClient)))
.baseUrl(myEndPoint)
.build()
更新2021
HttpClient。在上一版本的被动Netty中已弃用。它正在复制tcpClient的配置。现在我们可以直接配置httpClient。
val httpClient = HttpClient.create()
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10_000)
.doOnConnected { connection ->
connection.addHandlerLast(ReadTimeoutHandler(10))
.addHandlerLast(WriteTimeoutHandler(10))
}
val myWebClient = webClientBuilder
.clientConnector(ReactorClientHttpConnector(httpClient))
.baseUrl(myEndPoint)
.build()
为了设置读取和连接超时,我使用下面的方法,因为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();
问题内容: 我org.springframework.ws.client.core.WebServiceTemplate用于拨打Web服务。如何为通话配置超时。 问题答案: 如果你使用的是Spring Webservices 2.1.0版本,则可以使用HttpComponentsMessageSender设置超时。 Spring不推荐使用CommonsHttpMessageSender,因此不再推
问题内容: 我在我的应用程序中使用Retrofit库,我想将超时设置为60秒。改装有某种方法可以做到这一点吗? 我以这种方式设置Retrofit: 如何设置超时时间? 问题答案: 您可以在基础HTTP客户端上设置超时。如果未指定客户端,则Retrofit将使用默认的连接和读取超时创建一个客户端。要设置自己的超时时间,您需要配置自己的客户端并将其提供给。 一种选择是使用也是来自Square 的OkH
但我想要的是这样的
我这样设置改型: 如何设置超时?
问题内容: 我创建了以下函数来检查连接状态: 当我关闭服务器以测试执行情况时,会在网上等待很长时间 有谁知道如何设置超时以避免等待太久? 问题答案: 在我的示例中,设置了两个超时。连接超时抛出,套接字超时。 如果要设置任何现有HTTPClient的参数(例如或,则可以使用函数。