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