我使用async-http-client
,但我遇到了与NettyAsyncHttpProvider
的问题。异步-http客户端请求与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