async-http-client
을 사용하고 있는데, NettyAsyncHttpProvider
과 관련하여 문제가 있습니다. 나는 다음과 같은 문제가 지속됩니다 Executors.newCachedThreadPool()
를 사용하는 경우에도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().
내 문제는 여기에 있습니다 :
그것은이 경고를 제공합니다.
스레드 수가 corePoolSize
에 도달하면 요청이 삭제됩니다. requestTimeoutInMs
또는 다른 옵션을 사용해도 반응의 일부만 돌아오고 풀의 스레드가 멈 춥니 다. 내가 ApacheAsyncHttpProvider
에 NettyAsyncHttpProvider
에서 변경하는 경우
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);
}
});
}
는 이제 모든 요청이 수행됩니다.
문제를 보여주기 위해 github에서 샘플 프로젝트를 만들었습니다. async-http-client-debugging