我正在使用
它给出了以下警告:
async-http-client
,但是在NettyAsyncHttpProvider
方面遇到了问题。它给出了以下警告:
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().
我的问题是即使我使用Executors.newCachedThreadPool()
,以下问题仍会存在。
一旦线程数达到corePoolSize
,请求将被丢弃。无论我尝试使用的requestTimeoutInMs
或其他选项,只有部分响应返回,池中的线程停滞不前。
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);
}
});
}
现在,如果我从NettyAsyncHttpProvider
更改为ApacheAsyncHttpProvider
,则所有请求都会执行。
我在Github上创建了一个示例项目,展示了这个问题。async-http-client-debugging