无法在 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();
以下是我的代码
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();