Async-http-client requests sync with NettyAsyncHttpProvider

I am using async-http-client

but I am having problems with NettyAsyncHttpProvider

.

This is a warning:

Oct 28, 2014 12:50:16 PM org.jboss.netty.channel.socket.nio.AbstractNioWorkerPool
WARNING: Failed to get all worker threads ready within 10 second(s). Make sure to specify the executor which has more threads than the requested workerCount. If unsure, use Executors.newCachedThreadPool().

      

My problem is here, even if I use the Executors.newCachedThreadPool()

following problem will persist.

As soon as the number of threads reaches corePoolSize

, the requests will be deleted. No matter what requestTimeoutInMs

or other parameters I try, only a subset of responses and threads in the pool are returned.

ExecutorService executor = new CustomThreadPoolExecutor(2, 2, 60,
            TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new ThreadFactory() {
        @Override
        public Thread newThread(Runnable r) {
            int number = threadCreationCount.incrementAndGet();
            LOG.info("newThread - {} ", number);

            Thread th = new Thread(r);
            th.setName("AsyncHttpClient-" + number);
            LOG.info("thread ={}", th);
            return th;
        }
    });

    AsyncHttpClientConfig.Builder builder = new AsyncHttpClientConfig.Builder();
    builder.setMaximumConnectionsTotal(-1)
            .setMaximumConnectionsPerHost(-1)
            .setConnectionTimeoutInMs(1000)
            .setIdleConnectionInPoolTimeoutInMs(60000)
            .setIdleConnectionTimeoutInMs(60000)
            .setRequestTimeoutInMs(3000)
            .setFollowRedirects(true)
            .setMaximumNumberOfRedirects(5)
            .setAllowPoolingConnection(true)
            .setIOThreadMultiplier(4)
            .build();

    builder.setExecutorService(executor);

    AsyncHttpClientConfig config = builder.build();
    AsyncHttpClient client = new AsyncHttpClient(new NettyAsyncHttpProvider(config), config);

    //Spin up 500 async requests to google.com
    for (int i = 1; i <= 500; i++) {
        LOG.info("i = {}", i);
        ListenableFuture<Response> future = client.prepareGet("http://www.google.com").execute(
                new AsyncCompletionHandler<Response>() {
                    @Override public Response onCompleted(Response response) throws Exception {
                        LOG.info("Response = {}, count = {}", response.getStatusCode(),
                                responseCount.incrementAndGet());
                        return response;
                    }

                    @Override
                    public void onThrowable(Throwable t) {
                        LOG.error("on throwable ={}", t);
                    }

                });
    }

      

Now if I change from NettyAsyncHttpProvider

to ApacheAsyncHttpProvider

, all requests are executed.

I created a sample project on github to demonstrate the problem. async-http-client-debugging

+3


source to share


2 answers


I was getting the same problem when using the default executor service. I haven't debugged why, but using this configuration below, I didn't get the 10 second delay and warning message.



AsyncHttpClientConfig.Builder builder = new AsyncHttpClientConfig.Builder();
    builder.setConnectTimeout(3000)
            .setExecutorService(new ThreadPoolExecutor(0, 20,
                    60L, TimeUnit.SECONDS,
                    new SynchronousQueue<>()))
            .setRequestTimeout(3000)
            .setReadTimeout(3000)
            .build();

      

+1


source


This is not a threading problem. There are two things here:

  • you are sending a huge number of requests at the same time, without any kind of backpressure, so trying to open 500 concurrent connections at the same time. You'd better have a queue and a dedicated Executor in front of the AHC so that you can limit and control the number of simultaneous flight requests.
  • you clog google.com. They do not allow you to do this, of course, and block connection attempts.


PS: You would have a quick answer if you asked in the google AHC group.

-1


source







All Articles