首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AsyncRestTemplate配置队列大小

AsyncRestTemplate配置队列大小
EN

Stack Overflow用户
提问于 2017-01-22 12:31:53
回答 1查看 310关注 0票数 2

我有一个每小时运行一次的作业,在40核服务器上,每个作业可以有1到10万个任务(需要大队列),每个任务在完成时执行HTTP请求,每个任务都是关键的,这意味着它必须运行和完成。

任务可以异步运行。

如何配置池中的线程数?如何配置队列大小?

在这个测试中,我试图让我的任务被拒绝并淹没我的线程池,但是我却得到了SocketTimeoutException

代码语言:javascript
复制
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");
}
EN

回答 1

Stack Overflow用户

发布于 2021-10-25 08:11:55

你可以这样做:

代码语言:javascript
复制
ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();
poolTaskExecutor.setQueueCapacity(100);
CloseableHttpAsyncClient httpclient = HttpAsyncClients
     .custom()
     .setThreadFactory(poolTaskExecutor).build();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41790912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档