RequestConfig和IOReactorConfig上的超时设置之间的区别?

时间:2018-04-30 15:33:13

标签: java http timeout apache-httpclient-4.x apache-httpasyncclient

我正在使用Apache HTTP异步客户端,我必须对它进行一些配置。

我有以下代码,但在设置RequestConfigIOReactorConfig时我感到困惑,因为您可以为这两个代码指定超时配置。

我的问题是:这两个配置之间的超时有什么不同?这是双重工作,我可以设置其中一个配置?或者,这两个配置的超时控制不同的东西?

    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());

1 个答案:

答案 0 :(得分:4)

I / O反应器参数适用于由I / O反应器管理的连接通道。连接通道代表双向数据流,并且与应用程序协议无关。

HTTP请求参数适用于单个HTTP请求,并控制这些请求的执行方式。

很久以前,用户要求一种简单的方法来基于每个请求覆盖套接字超时。回想起来,引入这种参数的决定可能是一个错误。

连接通道级别上的套接字超时与HTTP级别上的套接字超时之间的重要区别仅在HTTP路由完全建立之后才适用,该过程可能涉及TLS升级和中间代理隧道跃点,而连接通道级超时立即应用于该通道上的所有I / O.

IOReactorConfig视为默认值,将RequestConfig视为个案覆盖。

RequestConfig#socketTimeout已在HttpClient 5.0中删除