RequestConfig 和 IOReactorConfig 超时设置的区别?
difference between timeout settings on RequestConfig and IOReactorConfig?
我正在使用 Apache HTTP 异步客户端,我必须对其进行一些配置。
我有以下代码,但是在设置 RequestConfig
和 IOReactorConfig
时我很困惑,因为您可以为它们指定超时配置。
我的问题是:这两个配置之间的超时有什么区别?这是双重工作吗?我可以只设置其中一个配置吗?或者,这两个Config的超时时间在控制不同的东西?
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(socketTimeout)
.setConnectTimeout(connectionTimeout)
.setConnectionRequestTimeout(connectionRequestTimeout)
.build();
// Create I/O reactor configuration
IOReactorConfig ioReactorConfig = IOReactorConfig.custom()
.setIoThreadCount(Runtime.getRuntime().availableProcessors())
.setConnectTimeout(connectionTimeout)
.setSoTimeout(socketTimeout)
.build();
// Create a custom I/O reactort
ConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(ioReactorConfig);
PoolingNHttpClientConnectionManager cm = new PoolingNHttpClientConnectionManager(ioReactor);
cm.setMaxTotal(maxConnTotal);
cm.setDefaultMaxPerRoute(maxConnPerRoute);
HttpAsyncClientBuilder defaultBuilder = HttpAsyncClients.custom()
.setDefaultRequestConfig(requestConfig)
.setConnectionManager(cm)
.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
.setRedirectStrategy(new LaxRedirectStrategy());
I/O 反应器参数适用于由 I/O 反应器管理的连接通道。连接通道代表双向数据流并且与应用程序协议无关。
HTTP 请求参数适用于单个 HTTP 请求并控制这些请求的执行方式。
很久以前,用户要求一种简单的方法来基于每个请求覆盖套接字超时。现在回想起来,引入这样的参数的决定很可能是个错误。
连接通道级别的套接字超时与 HTTP 级别的套接字超时之间的重要区别是后者仅在完全建立 HTTP 路由后适用,该过程可能涉及 TLS 升级和中间代理隧道跃点,而连接通道级别超时立即应用于该通道上的所有 I/O。
将 IOReactorConfig
视为默认设置,将 RequestConfig
视为具体情况。
RequestConfig#socketTimeout
已在 HttpClient 5.0
中删除
我正在使用 Apache HTTP 异步客户端,我必须对其进行一些配置。
我有以下代码,但是在设置 RequestConfig
和 IOReactorConfig
时我很困惑,因为您可以为它们指定超时配置。
我的问题是:这两个配置之间的超时有什么区别?这是双重工作吗?我可以只设置其中一个配置吗?或者,这两个Config的超时时间在控制不同的东西?
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(socketTimeout)
.setConnectTimeout(connectionTimeout)
.setConnectionRequestTimeout(connectionRequestTimeout)
.build();
// Create I/O reactor configuration
IOReactorConfig ioReactorConfig = IOReactorConfig.custom()
.setIoThreadCount(Runtime.getRuntime().availableProcessors())
.setConnectTimeout(connectionTimeout)
.setSoTimeout(socketTimeout)
.build();
// Create a custom I/O reactort
ConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(ioReactorConfig);
PoolingNHttpClientConnectionManager cm = new PoolingNHttpClientConnectionManager(ioReactor);
cm.setMaxTotal(maxConnTotal);
cm.setDefaultMaxPerRoute(maxConnPerRoute);
HttpAsyncClientBuilder defaultBuilder = HttpAsyncClients.custom()
.setDefaultRequestConfig(requestConfig)
.setConnectionManager(cm)
.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
.setRedirectStrategy(new LaxRedirectStrategy());
I/O 反应器参数适用于由 I/O 反应器管理的连接通道。连接通道代表双向数据流并且与应用程序协议无关。
HTTP 请求参数适用于单个 HTTP 请求并控制这些请求的执行方式。
很久以前,用户要求一种简单的方法来基于每个请求覆盖套接字超时。现在回想起来,引入这样的参数的决定很可能是个错误。
连接通道级别的套接字超时与 HTTP 级别的套接字超时之间的重要区别是后者仅在完全建立 HTTP 路由后适用,该过程可能涉及 TLS 升级和中间代理隧道跃点,而连接通道级别超时立即应用于该通道上的所有 I/O。
将 IOReactorConfig
视为默认设置,将 RequestConfig
视为具体情况。
RequestConfig#socketTimeout
已在 HttpClient 5.0