Асинхронный HTTP-клиент для Java - PullRequest
18 голосов
/ 18 июня 2009

Как относительный новичок в мире Java, я нахожу множество вещей, которые разочаровывающе глупы для выполнения, которые относительно тривиальны во многих других средах. Основной пример - простое решение для асинхронных HTTP-запросов. Видя, что человек, кажется, уже не существует, каков наилучший подход? Создание собственных потоков с использованием блокирующего типа lib, такого как httpclient или встроенного Java-содержимого http, или использование более нового неблокирующего io-содержимого Java - это кажется особенно сложным для чего-то, что должно быть простым.

То, что я ищу, - это что-то простое в использовании с точки зрения разработчика - что-то похожее на URLLoader в AS3 - где вы просто создаете URLRequest - присоединяете несколько обработчиков событий для обработки завершения, ошибок, прогресса и т. Д. и вызвать метод для его запуска.

Если вы не знакомы с URLLoader в AS3, это так просто и выглядит примерно так:

private void getURL(String url)
{
    URLLoader loader = new URLLoader();
    loader.addEventListener(Event.Complete, completeHandler);
    loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
    loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);

    URLRequest request = new URLRequest(url);

    // fire it off - this is asynchronous so we handle
    // completion with event handlers
    loader.load(request);
}

private void completeHandler(Event event)
{
    URLLoader loader = (URLLoader)event.target;
    Object results = loader.data;

    // process results
}

private void httpStatusHandler(Event event)
{
    // check status code
}

private void ioErrorHandler(Event event)
{
    // handle errors
}

Ответы [ 13 ]

15 голосов
/ 16 апреля 2010

Используйте «Async Http Client», ранее называемый клиентской библиотекой ning http. Увидеть http://code.ning.com/2010/03/introducing-nings-asynchronous-http-client-library/

Теперь доступно на GitHub https://github.com/ning/async-http-client

8 голосов
/ 15 ноября 2009

Версия 4.0 Apache Commons HttpClient (теперь в HttpComponents / HttpCore ) также поддерживает Java NIO (неблокирующий ввод-вывод). Я думаю, что это ваша лучшая ставка.

6 голосов
/ 19 июня 2009

Если вы еще не посмотрели его, ознакомьтесь с Java 5 java.util.concurrent - он значительно облегчает разработку многопоточных приложений. Вы можете настроить ThreadPoolExecutor, который управляет, скажем, четырьмя потоками. Затем вы наполняете пул любым количеством задач для выполнения. Каждое задание является Runnable. ThreadPoolExecutor помещает в очередь задачи Runnable и параллельно передает их доступным потокам. Метод afterExecute () пула вызывается при завершении каждой задачи Runnable.

Я прекрасно помню, как писал пул потоков извлечения для веб-браузера, написанного на Java еще в 1999 году, и это был медведь , чтобы получить право. В прошлом месяце я написал тестер нагрузки для веб-сервера. У тестера есть ThreadPoolExecutor, у которого есть n потоков, и задачи Runnable, которые я передаю, каждый загружают страницу, используя HTTP-клиент Apache. Потребовалось всего час или два, чтобы все заработало достаточно хорошо. Я думаю, вам понравится java.util.concurrent в сочетании с HTTP-клиентом Apache, хотя, похоже, вам потребуется выполнить некоторые настройки для индикации прогресса.

(Обратите внимание, что Apache HTTP Client выполняет собственный пул потоков, а конфигурация по умолчанию ограничивает вас максимум 20 потоками и только двумя для каждого веб-сервера.)

Обновление: вот ссылка на Apache HTTP Client . Обязательно прочитайте MultiThreadedHttpConnectionManager , это то, что обрабатывает пул соединений, и это не показано в самом простом примере.

5 голосов
/ 15 ноября 2009

HTTP-клиент Jetty является асинхронным.

5 голосов
/ 18 июня 2009

Похоже, что вы хотите (часть) NIO - здесь есть хорошее руководство , часть асинхронной сети начинается с p. 30, и в конце есть много полезных ссылок.

2 голосов
/ 16 ноября 2015

есть библиотеки и фреймворки, написанные поверх NIO / Netty - RxNetty и Vertx , которые могут быть полезны для написания асинхронного HTTP-клиента

Ниже приведен пример кода с использованием vertx

public class Client extends AbstractVerticle {

  @Override
  public void start() throws Exception {
    //lambda callback would be called when the response comes back
    vertx.createHttpClient().getNow(8080, "localhost", "/", resp -> {
      System.out.println("Got response " + resp.statusCode());
      resp.bodyHandler(body -> {
        System.out.println("Got data " + body.toString("ISO-8859-1"));
      });
    });
   //this code statement will execute before response comes back
   System.out.println("I am not blocked");
  }
}

Вы можете найти полный пример кода из здесь

1 голос
/ 18 июля 2009

Взгляните также на http://www.javaworld.com/javaworld/jw-03-2008/jw-03-asynchhttp.html В этой статье обсуждается асинхронный HTTP на основе HttpClient с именем xLightweb

1 голос
/ 19 июня 2009

httpunit и htmlunit - это 2 настраиваемых и настраиваемых клиента Java http, которые могут работать с любым браузером, например, имитировать Firefox, просмотр без заголовка, клиенты и агенты по расписанию.

1 голос
/ 18 июня 2009

AFAIK инструмент TCPMon использует подход, аналогичный тому, что вы описываете. Вы можете взглянуть на исходный код в их браузере SVN

Также взгляните на WGET-java , чтобы узнать подробности кода блокировки.

Но вы должны написать это на Java? Есть много других подходов, использующих JRuby или Rhino для легкого выполнения чего-то подобного, которое будет работать на JVM, но не написано на Java.

1 голос
/ 18 июня 2009

Итак, вероятно, стоит учесть, что ActionScript и Java не занимают одну и ту же нишу. Например, Java делает некоторые вещи более утомительными, но обычно это дает пользователю больше возможностей в том, как, например, выполняется HTTP-соединение, тогда как actionScript может абстрагировать детали или возможные ошибки для простоты использования. Но ваша точка зрения остается в силе.

Я сам не знаю об асинхронном HTTP-клиенте для Java. Ответ Алекса Мартелли говорит о NIO Java, который является хорошим ответом, если вы заинтересованы в реализации протокола HTTP в своем собственном коде. NIO позволит вам использовать сокеты для подключения к веб-серверу, но затем вам придется вручную создавать свои собственные запросы GET и анализировать входящие заголовки / данные HTTP.

Другой вариант - использовать классы java.net.URL - и вы можете найти множество учебных пособий для них в режиме онлайн и в режиме stackoverflow. Вы можете обернуть их в потоки, чтобы ваша Java-программа выполняла несколько потоков.

Но тогда вы столкнетесь с проблемой синхронизации. Что я согласен, это боль, но тогда она предлагает более детальный уровень гибкости.

(я понимаю, что это не отвечает на ваш вопрос - и если кто-то действительно знает о java-средстве для выполнения асинхронных http-запросов, мне было бы интересно узнать!)

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