Как обрабатывать асинхронные вызовы Java из вызова AJAX - PullRequest
0 голосов
/ 11 августа 2010

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

Суть моего вопроса что бы я делал с HttpRequest, пока я жду возвращения второго вызова?

Должен ли я просто блокировать и ждать вызова в методе обработчика AJAX, или я храню запрос где-нибудь и жду обратного вызова? Как бы я обработал ошибки / тайм-ауты?

Для тех, кому небезразлична дополнительная информация о том, как я пришел к этой ситуации, следует:

Это часть системы обмена мгновенными сообщениями на основе XMPP. Существует один пользователь глобальной поддержки, который отображается в виде значка на каждой странице нашего веб-приложения. Я также хочу отобразить присутствие этого пользователя, , поэтому , я мог бы просто использовать систему IM для запроса присутствия этих пользователей при каждой загрузке страницы для каждого пользователя и, в конечном итоге, непосредственно в DDOS. Вместо этого я хочу, чтобы один пользователь периодически запрашивал информацию о присутствии из веб-приложения и кэшировал результат.

Поэтому AJAX-вызов поступает на сервер, который затем либо возвращает кэшированное присутствие, либо запрашивает сервер XMPP асинхронно.

Ответы [ 3 ]

0 голосов
/ 11 августа 2010

вот что я бы сделал:

  • при запуске страницы, инициируйте задание, чтобы получить массив данных, который вам нужен для этой конкретной страницы, вам нужно определить задание и результат задания для последующего использования.
  • используйте ajax со страницы для опроса результата работы, после того, как работа завершена, опрос заканчивается и возвращается с данными
  • кэшируйте записи, которые вы запросили, как указано Вивином
  • кэшируйте результат работы на вашем сервере и дайте ему опцию тайм-аута
0 голосов
/ 11 августа 2010

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

Это фактически означает, что вы должны удерживатьк объекту HttpServletResponse на время вызова.Объект HttpServletRequest больше не требуется, когда выполняется разбор HTTP-запроса и когда все данные доступны для вашего приложения;это именно тот объект ответа, который важен в вашем контексте.

Ответ может быть заполнен кэшированной копией статуса пользователя.Если копия в кэше устарела, вы можете обновить ее синхронно с сервера XMPP (в конце концов, это влияет на производительность загрузки только одной страницы).Вы можете выполнять асинхронный запрос на сервере приложений, но некоторый результат должен быть возвращен браузеру (так что может быть несколько крайних случаев, о которых нужно позаботиться).

0 голосов
/ 11 августа 2010

Вам не нужно блокировать и ждать вызова AJAX.То есть, не звоните синхронно.Что вы должны сделать на стороне Java, так это выяснить способ блокировки, пока вы ждете ответа от асинхронного вызова (т. Е. Найти способ сделать запрос синхронно . ПроизводительностьХит будет при первом вызове для любых новых данных. Последующие вызовы попадут в кеш, так что вы должны быть в порядке).Вы можете сохранить кеш для этих данных, чтобы сначала проверить кеш, чтобы увидеть, существуют ли данные.Если это не сделать вызов и сохранить результат в кеше.В противном случае, захватите данные из кэша и отправьте их обратно в представление.Поскольку AJAX является асинхронным, ваш обратный вызов будет вызван, как только данные вернутся с сервера.

...