春天5 webflux如何设置Web客户端
我想设置超时我的WebClient超时,这里是当前的代码:春天5 webflux如何设置Web客户端
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();
但我想不出如何设置的HttpClient在我的WebClient
的WebFlux WebClient
不使用Apache的百科全书HTTP客户端。尽管您可能可以通过自定义ClientHttpConnector
实施一个解决方案。现有的ReactorClientHttpConnector
基于Netty。因此,考虑使用Netty的选项来配置客户端,如:
ReactorClientHttpConnector connector =
new ReactorClientHttpConnector(options ->
options.option(ChannelOption.SO_TIMEOUT, this.applicationConfig.getHttpClientConnectTimeout()));
或
.onChannelInit(channel -> channel.config().setConnectTimeoutMillis(this.applicationConfig.getHttpClientConnectTimeout()))
UPDATE
我们也可以使用ReadTimeoutHandler
:
.onChannelInit(channel ->
channel.pipeline()
.addLast(new ReadTimeoutHandler(this.applicationConfig.getHttpClientConnectTimeout())))
这里的我是怎么做到的(感谢@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();
要设置读取和连接超时我使用下面的方法,因为SO_TIMEOUT选项不适用于使用NIO(并给予警告Unknown channel option 'SO_TIMEOUT' for channel '[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();
我会试试看,谢谢分享 – Seb
Upvoted。这应该是正确的答案。 c.f. https://stackoverflow.com/a/22897119/839733 –
这似乎是我寻找,只是一个简单的问题是,连接超时或请求超时。任何想法如何设置连接池大小?感谢您的帮助 – Seb
'reactor.ipc.netty.options.ClientOptions.Builder'中有'poolResources()''requestTimeout'确实等于'ChannelOption.SO_TIMEOUT'。 'connectTimeoutMillis'肯定是关于连接的。 –
是的,我看到poolResources(),我不得不承认我不知道如何使用它:/任何想法? – Seb