Вопрос по java, http – Асинхронный HTTP-клиент для Java

18

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

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

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

<code>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
}
</code>

Ваш Ответ

12   ответов
6

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

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

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

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

Хорошая информация Благодарю. Я до сих пор не могу поверить, насколько недружественным клиентом является Java. Может быть, Java только начинает показывать свой возраст. helifreak
Нет, это не значит, что Java показывает возраст; проверить несколько неблокирующих (асинхронных) http-клиентов, не входящих в JDK. Нет необходимости явно связываться с потоками только для одновременного доступа. Хотя в JDK было бы удобно иметь неблокирующую альтернативу, есть так много полезных вещей, что, вероятно, лучше постараться не допустить, чтобы JDK увеличился.
Я почти не занимался разработкой Java в течение 1.4 и 5 лет в Java, и теперь я нахожу Java 6 значительно лучше, чем 1.3. В дополнение к java.util.concurrent выделяются дженерики и платформа Collections. Технология на уровне Java может показаться недружественной: сравните JAXP с лаконичной обработкой XML в Groovy. Также. Динамические языки, такие как Ruby, Python и Scala, сегодня являются серьезной конкуренцией.
1

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

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

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

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

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

На самом деле существует несколько асинхронных http-клиентов, перечисленных в других ответах (у Jetty уже один год есть один, jakarta hc тоже довольно давно; асинхронный http-клиент ning является новейшим и активно развивается). Они просто не получили достаточно внимания, которого они заслуживают.
Полностью разбираюсь в разных нишах. Однако в этом случае мы используем Java в качестве клиентской инфраструктуры пользовательского интерфейса, и большая часть данных, которые будут представлены, поступает от внешних веб-сервисов. helifreak
15

Async Http Client & quot; ранее назывался ning http клиентская библиотека. Увидеть http://code.ning.com/2010/03/introducing-nings-asynchronous-http-client-library/

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

Они фактически изменили репозитории GitHub снова и теперь находятся наgithub.com/sonatype/async-http-client, Я обновил ответ, чтобы отразить правильное местоположение репо сейчас.
И это в github вgithub.com/ning/async-http-client, Я могу порекомендовать это, воспользовавшись им, хотя в основном просто как надежный синхронный http-клиент. Но с простыми результатами на основе будущего асинхронная операция также проста в использовании.
Похоже, он снова переехал:github.com/AsyncHttpClient/async-http-client
Они изменили репозитории GitHub, теперь они наgithub.com/AsyncHttpClient/async-http-client
0

реализованный в Geronimo. Вы также можете посмотреть наhttp://svn.apache.org/viewvc/geronimo/sandbox/AsyncHttpClient/ - Предостережение: последний коммит, кажется, старше года.

Еще один проект по созданию асинхронного HTTP-клиента - xsocket: xsocket.sourceforge.net

этоcwiki.apache.org/AWEB кажется текущее местоположение. Не уверен, насколько он активен.
5

Вотчасть асинхронной сети начинается с p. 30 и есть много полезных ссылок в конце.

1

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

Также посмотрите наWGET-ява для кишок кода блокировки.

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

Что ж, использование других языков, которые компилируются в байт-код Java, является будущим вариантом, но нам определенно нужно что-то на основе Java. Спасибо за предложения. helifreak
5

Jetty HTTP клиент асинхронный

1

HttpUnit а такжеHtmlUnit 2 настраиваемых и настраиваемых клиента Java http, которые могут работать с любым браузером, например, имитировать Firefox, просмотр без головы, запланированные клиенты и агенты программного обеспечения.

Я собирался упомянуть об этом, но ни один из них не является асинхронным. Тем не менее, они довольно быстро выполняют задачи автоматизации.
0

рвером. Доступно для скачивания из следующего местоположения:

https://svn.apache.org/repos/asf/mina/asyncweb/trunk

Но разве это не мертвый проект?
8

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

2

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

Взгляните также наhttp://www.javaworld.com/javaworld/jw-03-2008/jw-03-asynchhttp.html This article discusses async HTTP based on a HttpClient named xLightweb

Увидетьxlightweb.sourceforge.net, Вроде бы активно развивается.

Похожие вопросы