【问题标题】:difference between timeout settings on RequestConfig and IOReactorConfig?RequestConfig 和 IOReactorConfig 的超时设置有什么区别?
【发布时间】:2018-10-10 17:42:34
【问题描述】:

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

我有以下代码,但是在设置 RequestConfigIOReactorConfig 时我很困惑,因为您可以为它们指定超时配置。

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    IOReactorConfig 视为默认设置,将RequestConfig 视为逐个覆盖。

    RequestConfig#socketTimeout 已在 HttpClient 5.0 中删除

    【讨论】:

    • 你能解释一下什么是 PoolingNHttpClientConnectionManager , setDefaultMaxPerRoute , setMaxTotal 。由于这个问题 java.io.IOException: An existing connection was forcefully closed by the remote host,我使用这些在 Elasticsearch 中配置 RestClient。我做的对吗
    猜你喜欢
    • 2011-10-18
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 2016-04-26
    • 1970-01-01
    相关资源
    最近更新 更多