Выполнить асинхронное соединение с библиотекой Java AsyncHttpClient? - PullRequest
0 голосов
/ 12 августа 2011

Я просто портирую некоторый код с .net на Java.Я использовал библиотеку AsyncHttpClient (https://github.com/sonatype/async-http-client) с провайдером Netty.

При небольшом тестировании я с удивлением обнаружил, что во время вызова execute, например:

httpClient.prepareGet("http://bbc.co.uk").execute(
                  new AsyncCompletionHandler<Response>() { ... });

NettyAsyncHttpProvider выполняет загрузочное подключение к сайту, т. Е.

bootstrap.connect(new InetSocketAddress(
                                        AsyncHttpProviderUtils.getHost(uri), 
                                        AsyncHttpProviderUtils.getPort(uri)));

EDIT: , чтобы уточнить класс NettyAsyncHttpProvider, который является частью библиотеки AsyncHttpClient. Он не имеет ничего общего с самой Netty.

Это означает, что на чем-то похожем на веб-сайт bbc (на моем обычном соединении) выполнение завершается примерно через 300 мс (тогда асинхронное получение / завершение происходит почти сразу). Это действительно убивает производительность моего диспетчера, которыйПопытка начать несколько асинхронных вызовов. Когда каждый вызов в один и тот же домен, он работает хорошо. В моей ситуации у меня есть сотни различных доменов, поэтому каждый вызов влечет за собой начальную задержку, в то время как соединение установлено, что убивает пропускную способность диспетчера.

Может кто-нибудь предложить какие-либо советы о том, как использоватьбиблиотека, так что она действительно работает асинхронно или в альтернативной библиотеке?

Спасибо, Пол

Ответы [ 2 ]

2 голосов
/ 30 августа 2011

Чтобы ответить на мой собственный вопрос ... в конце концов я попробовал оригинальную библиотеку AsyncHttpClient, Jetty и Apache HttpAsyncClient (http://hc.apache.org/httpcomponents-asyncclient-dev/index.html), чтобы попытаться найти библиотеку, которая на 100% асинхронна.

Насколько я могу судить, каждая из этих библиотек выполняет блокирующее соединение перед асинхронным выполнением фактического http-запроса.

Чтобы двигаться вперед, я выполнил каждый http-запрос в своем собственном потоке. Я следовал шаблону, описанному в разделе «2.9. Выполнение многопоточных запросов» (http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html), в котором подробно описано, как использовать этот подход.

Этот подход теперь работает хорошо и позволяет моему «диспетчеру» быстро создавать многочисленные асинхронные вызовы без каких-либо блокировок в главном потоке.

0 голосов
/ 12 августа 2011

Да, вы смотрели на Java неблокирующий API?(он же NIO)?Об этом есть поток переполнения стека , который полезен.Также эта статья IBM developerWorks должна помочь вам понять, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...