Все,
Я пытаюсь решить, использовать ли NodeJS или Java для своего приложения. Я буду общаться с CouchDB через HTTP и хотел бы асинхронный неблокирующий дизайн, в котором поток моего приложения может обрабатывать дополнительные запросы, ожидая ответа на запрос от CouchDB.
Я бы предпочел использовать Java, и я несколько дней рассматривал AsyncHttpClient как потенциальное решение. Однако у меня возникли проблемы с пониманием библиотеки, и я думаю, что у меня может быть фундаментальное непонимание чего-то.
Я разместил суть здесь: https://gist.github.com/conorgil/5505603
Я ожидаю, что этот смысл распечатает «Запрос X отправлен!» И «Ответ X: что-то» для каждого запроса. Однако похоже, что вызов HTTP не выполняется (и, следовательно, обработчик не выполняется) до тех пор, пока каждый Future не вызовет get(). Раскомментирование строки 23 f.get() приводит к тому, что код работает как положено, но вызов Future#get() блокируется, верно? Есть ли способ просто предоставить функцию обратного вызова, которая выполняется после полного получения ответа HTTP без блокировки?
Что-то вроде следующего: 1) запрос поступает в основной поток 2) выполняется асинхронный неблокирующий HTTP-вызов CouchDB. Обработчик завершения регистрируется для обработки ответа от CouchDB 3) основной поток теперь свободен для обработки следующего запроса 4) HTTP-ответ от CouchDB поступает в какой-то момент, и зарегистрированный обработчик вызывается для выполнения некоторой бизнес-логики 5) основной поток продолжается просто обработка запросов (для запросов, которые не нужно попадать в CouchDB, на них можно ответить очень быстро)
Я что-то принципиально неправильно понимаю здесь? Возможно ли сделать что-то подобное на Java? Является ли AsyncHttpClient ответом? Этот вопрос связан, но не уверен, что что-то изменилось с 2011 года (Выполнить асинхронное подключение с библиотекой Java AsyncHttpClient?)
Поскольку NodeJS запускает цикл обработки событий, такое неблокирующее асинхронное поведение является стандартным. Вы просто зарегистрируете функцию обратного вызова для обработки ответа БД, когда он будет получен, а цикл событий тем временем просто обработает другие вещи.
Любые советы приветствуются.
Спасибо, Конор