无法在RequestConfig中设置套接字超时小于1000毫秒(Apache HTTP异步客户端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 ms的值。

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

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

最新更新