Как работать с длительными http запросами

У меня есть длительный http-запрос (много вычислений в бэкэнде).

В настоящее время все синхронно, в то время как серверный компьютер, браузер не видит вывод/результат. Через некоторое время соединение обрывается и в браузере отображается ошибка тайм-аута.

Я хотел бы сразу же вернуть некоторую информацию в браузер и заставить его ждать результата. Как этого добиться?

Обратите внимание, что серверная часть Java является синхронной. Таким образом, для решения потребуется некоторый взлом в сервлете/внешнем интерфейсе, возможно, требующий запросов javascript..?


person Roay Spol    schedule 14.05.2013    source источник


Ответы (3)


Вероятно, вы захотите использовать шаблон COMET. Это похоже на паттерн AJAX, только с долговременными HTTP-запросами для имитации фида. Подробнее см. здесь.

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

Эта временная последовательность заставляет его чувствовать себя как корм.

В вашем случае он может просто немедленно вернуть «да, я работаю над этим», а затем ответить «все еще обрабатывается 10% готово, чувак» и так далее, пока вы не вернете «готово».

Такие вещи, как node.js, действительно хороши для реализации такой функциональности.

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

person Jeff Watkins    schedule 14.05.2013

Тайм-аута не будет, пока вы что-то записываете в выходной поток (это могут быть даже пробелы, не забудьте вызвать flush()).

Такой длительный запрос имеет смысл, когда вы, например, печатаете большой отчет, который показывается пользователю впоследствии по мере его формирования.

Во всех остальных случаях верните страницу ожидания пользователю и используйте периодические запросы AJAX, чтобы узнать, завершена ли обработка. Когда ничего не меняется и браузер показывает загрузку, это не очень удобно для пользователя.

person Danubian Sailor    schedule 14.05.2013

Лучшим решением будет использование AJAX-запросов. Как только запрос ajax истекает, вы можете отправить его снова с помощью JavaScript (вы можете показать какую-то кнопку). Вероятно, это лучшая практика для обработки тайм-аутов.

person Kirill Ivlev    schedule 14.05.2013
comment
первый запрос должен быть синхронным вызовом (я отправляю html-форму). - person Roay Spol; 14.05.2013
comment
@RoaySpol, вы всегда можете дождаться завершения вашего AJAX-запроса - person Kirill Ivlev; 14.05.2013