6

以下是我的代码

       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 毫秒的值。

4

1 回答 1

12

这种行为是故意的。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();
于 2016-07-05T08:48:23.737 回答