Java-неблокирующий HTTP-сервер - PullRequest
2 голосов
/ 12 ноября 2011

Я написал приложение, использующее встроенную Jetty, которое выполняет сетевые вызовы для других служб.

Я предполагаю, что обслуживающие потоки бездействуют, ожидая завершения сетевых вызовов.

Есть ли способ иметь рабочий поток, который переключается между запросами для выполнения работы, которая может быть выполнена в текущее время, а затем, когда сетевые вызовы return также обрабатывают это? Запрос будет возвращен, когда все работы для него будут завершены.

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

Любые ссылки или объяснения приветствуются.

Спасибо

Обновление: Я использую Membase и ElasticSearch (единственные сетевые вызовы). Membase возвращает объекты «Future», а ElasticSearch возвращает «ListenableActionFuture». Я хотел бы иметь возможность продолжить обработку потока в ответ на возвращаемые объекты.

Ответы [ 3 ]

4 голосов
/ 12 ноября 2011

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

2 голосов
/ 12 ноября 2011

Если вы хотите выполнять работу одновременно с IO, я предлагаю вам добавить пул потоков для выполнения этой работы. Можно повторно использовать существующие потоки, но это требует много дополнительной работы, возможно, слишком мало пользы.

2 голосов
/ 12 ноября 2011

Netty - это библиотека java, которая позволяет выполнять асинхронную работу в сети.

http://www.jboss.org/netty

Netty поддерживает http, но это библиотека довольно низкого уровня.

Библиотека более высокого уровня - finangle by twitter,

http://twitter.github.com/finagle/

Finangle построена поверх netty, но поддерживает пул соединений, балансировку нагрузки и имеет множество других функций.Finangle поддерживает http.

...