如何在 Apache 异步客户端中配置允许的待处理请求数 [英] How to configure the number of allowed pending requests in Apache async client

查看:20
本文介绍了如何在 Apache 异步客户端中配置允许的待处理请求数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个 HTTP 客户端应用程序,使用 Apache httpasyncclient 版本 4.0.2.

I'm developing an HTTP client application, using Apache httpasyncclient version 4.0.2.

我想配置最大待处理请求数.最初我假设这个数字与最大连接数相同.我通过以下方式将其设置为 20:

I would like to configure the maximum number of pending requests. Initially I assumed this number is the same as the maximum number of connections. I set this to 20 in the following way:

    final CloseableHttpAsyncClient httpclient;

在构造函数中:

    final NHttpConnectionFactory<ManagedNHttpClientConnection> connFactory = new ManagedNHttpClientConnectionFactory(new DefaultHttpRequestWriterFactory(), new DefaultHttpResponseParserFactory(), HeapByteBufferAllocator.INSTANCE);
    final IOReactorConfig ioReactorConfig = IOReactorConfig.custom()
            .setIoThreadCount(4)
            .setConnectTimeout(30000)
            .setSoTimeout(30000)
            .build();
    final PoolingNHttpClientConnectionManager connManager = new PoolingNHttpClientConnectionManager(new DefaultConnectingIOReactor(ioReactorConfig), connFactory);
    final int maxConns = 20;
    connManager.setDefaultMaxPerRoute(maxConns);
    connManager.setMaxTotal(maxConns);
    httpclient = HttpAsyncClientBuilder.create().setConnectionManager(connManager).build();
    httpclient.start();

及以后:

    final BasicAsyncRequestProducer requestProducer = new BasicAsyncRequestProducer(URIUtils.extractHost(URI.create(serverAddress)), request) {
        @Override
        public void requestCompleted(HttpContext context) {
            pendings.add(callback);
            logMessage(Direction.REQUEST, req);
            handler.onContentWriteCompleted();
        }
    };
    httpclient.execute(requestProducer, HttpAsyncMethods.createConsumer(), new HttpClientContext(), callback);

回调是我处理响应的地方.

where callback is where I handle the response.

作为概念证明,它失败了.确实有四个线程在运行,但是当我尝试同时发送 20 条消息时,只有 8 条立即发送,其余的必须等待服务器响应.

As a proof of concept it fails. Indeed get do four threads running, but when I try to send 20 messages simultaneously, only 8 are sent immediately, the rest must wait until the server responds to them.

Apache 调试消息表明确实创建了 20 个连接.看来还得做更多的配置.

Apache debug messages are indicating that 20 connections have indeed been created. It seems that more configuration must be done.

?

推荐答案

Apache HttpAsyncClient 维护一个无限制的请求执行队列,并且不会尝试限制待处理请求的数量.各种应用程序可能想要也可能不想限制请求率,并且没有简单的方法来满足它们.

Apache HttpAsyncClient maintains an unbounded request execution queue and does not attempt to limit the number of pending requests. Various applications may or may not want to throttle request rate and there is no easy way to satisfy them all.

然而,使用一个简单的信号量可以很容易地限制并发请求的数量.

One can however fairly easily throttle the number of concurrent requests using a simple semaphore.

final Semaphore semaphore = new Semaphore(maxConcurrencyLevel);
for (int i = 0; i < n; i++) {

    semaphore.acquire();
    this.httpclient.execute(
            new BasicAsyncRequestProducer(target, request),
            new MyResponseConsumer(),
            new FutureCallback<HttpResponse>() {

                @Override
                public void completed(final HttpResponse result) {
                    semaphore.release();
                }

                @Override
                public void failed(final Exception ex) {
                    semaphore.release();
                }

                @Override
                public void cancelled() {
                    semaphore.release();
                }

            });
}

这篇关于如何在 Apache 异步客户端中配置允许的待处理请求数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆