无法在 RequestConfig 中将套接字超时设置为小于 1000 毫秒(Apache HTTP 异步客户端 4.1.2)

Unable to set Socket Timeout less than 1000 milliseconds in RequestConfig (Apache HTTP async client 4.1.2)

以下是我的代码

       RequestConfig requestConfig = RequestConfig.custom()
                .setSocketTimeout(100)
                .setConnectTimeout(100)
                .setConnectionRequestTimeout(100).build();


        CloseableHttpAsyncClient httpClient = HttpAsyncClients.custom()
                .setDefaultRequestConfig(requestConfig)
                .build();

        httpClient.start();

根据 setSocketTimeout 值,它应该在 100 毫秒内超时,但它需要 1000 毫秒才能超时。不过,setSocketTimeout 接受所有大于 1000 毫秒的值。

此行为是故意的。 i/o select 或线程需要定期迭代现有的 i/o 会话,并在 i/o 不活动的情况下触发套接字超时事件。此操作可能会变得非常昂贵,尤其是随着并发会话数量的增加。默认情况下 i/o select 间隔设置为 1000 毫秒,因此套接字超时的粒度默认为 1 秒。可以减少 select 间隔并使 i/o select 或线程更频繁地迭代会话,但代价是 CPU 利用率更高。 select 间隔为 1 毫秒 i/o select 否则线程将有效地 运行 处于繁忙循环中。

IOReactorConfig ioReactorConfig = IOReactorConfig.custom()
        .setSelectInterval(100)
        .setSoTimeout(100)
        .setConnectTimeout(100)
        .build();
CloseableHttpAsyncClient httpClient = HttpAsyncClients.custom()
        .setDefaultIOReactorConfig(ioReactorConfig)
        .build();