我有一个每小时运行一次的作业,在40核服务器上,每个作业可以有1到10万个任务(需要大队列),每个任务在完成时执行HTTP请求,每个任务都是关键的,这意味着它必须运行和完成。
任务可以异步运行。
如何配置池中的线程数?如何配置队列大小?
在这个测试中,我试图让我的任务被拒绝并淹没我的线程池,但是我却得到了SocketTimeoutException
public static void main(String[] args) throws IOReactorException {
String url = "http://internal.server:8001/get";
int connectionTimeout = 3000;
int soTimeout = 3000;
int maxHttpConnections = 30;
IOReactorConfig customIOReactorConfig = IOReactorConfig.custom()
.setIoThreadCount(Runtime.getRuntime().availableProcessors())
.setConnectTimeout(connectionTimeout)
.setSoTimeout(soTimeout)
.build();
ConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(customIOReactorConfig);
PoolingNHttpClientConnectionManager connManager = new PoolingNHttpClientConnectionManager(ioReactor);
connManager.setDefaultMaxPerRoute(maxHttpConnections);
connManager.setMaxTotal(maxHttpConnections);
CloseableHttpAsyncClient customHttpAsyncClient = HttpAsyncClients.custom()
.setConnectionManager(connManager)
.build();
HttpComponentsAsyncClientHttpRequestFactory asyncRequestFactory = new HttpComponentsAsyncClientHttpRequestFactory(customHttpAsyncClient);
AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate(asyncRequestFactory);
System.out.println("start");
for (int i = 0; i < 30_000; i++) {
asyncRestTemplate.execute(url, HttpMethod.GET, request -> logger.info("doWithRequest..."), response -> {
logger.info("extractData...");
return response.getStatusText();
}).addCallback(new ListenableFutureCallback<String>() {
@Override
public void onFailure(Throwable ex) {
logger.error("onFailure [{}] [{}]", ex.getMessage(), ex.getStackTrace()[0].toString());
}
@Override
public void onSuccess(String result) {
logger.info("onSuccess");
}
});
}
System.out.println("end loop");
}发布于 2021-10-25 08:11:55
你可以这样做:
ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();
poolTaskExecutor.setQueueCapacity(100);
CloseableHttpAsyncClient httpclient = HttpAsyncClients
.custom()
.setThreadFactory(poolTaskExecutor).build();https://stackoverflow.com/questions/41790912
复制相似问题