Код на стороне сервера Отправка данных в браузер клиента, когда текущий поток занят Comet (программирование) - PullRequest
3 голосов
/ 16 сентября 2009

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

И это может занять некоторое время от 30 до 45 минут для завершения всей операции, поэтому текущий поток все еще находится внутри функции обработчика события нажатия кнопки.

Эта фоновая задача предоставляет только одно событие, и веб-страница подписывается на него, чтобы получать некоторые текстовые данные после каждого этапа обработки

Я бродил, если есть какой-нибудь способ, которым я могу держать пользователя в курсе того, каков текущий прогресс в этой фоновой задаче. У меня есть элемент div для печати информации о текущем статусе

Так что я ищу какой-то обратный механизм, затем "get" и "post".

Я прочитал несколько статей о комете (программировании), но не могу найти ни простого, ни однозначного ответа

Заранее спасибо

Ответы [ 4 ]

2 голосов
/ 16 сентября 2009

Вы находитесь на правильном пути с «Comet» (он же Ajax-Push или reverse-Ajax) - Comet - это, по сути, обобщающий термин, позволяющий серверу «подтолкнуть» что-то обратно к клиенту без запуска клиента событие. Некоторые Ajax-фреймворки начинают встраивать это, и я бы не советовал пытаться реализовать себя близко к железу, потому что есть много разных вещей, которые нужно учитывать (разные серверы веб-приложений, модели потоков и т. Д.). Вы можете видеть, что StackOverflow обладает некоторыми из этих функций, когда он уведомляет вас о появлении нового ответа, если вы пишете его самостоятельно для данного вопроса.

Теперь, несмотря на все сказанное, в вашем случае, учитывая длительность обработки на стороне сервера, я согласен с ответом Брайана о том, что вы должны присвоить работающему заданию идентификатор и использовать более простой механизм обновления для его проверки. Если вы хотите добавить внешний вид толчка на стороне сервера, вы можете запросить сервер через стандартный ajax с интервалом, чтобы проверить, выполнено ли задание, а не просто обновить, и изменить страницу, когда она будет выполнена через этот Ajax. вызов. Если ваша работа способна сообщать о прогрессе, тогда стандартный ajax может обновить ваш div с этим прогрессом, и нет необходимости использовать push на стороне сервера.

2 голосов
/ 16 сентября 2009

Возможно, самый простой способ - это отправить работу и получить идентификатор обратно через простую страницу POST. Этот идентификатор соответствует длительному заданию на стороне сервера.

Затем возвращаемая страница может автоматически обновляться через механизм HTTP meta meta, а сервер может возвращать статус и т. Д. На обновленной странице. Страница будет постоянно обновляться с идентификатором каждые (скажем) 30 секунд, пока работа не будет завершена.

Это механизм грубой силы, но он прост. Плюс у этого есть преимущество, позволяющее пользователю добавить страницу в закладки и уходить / возвращаться. Учитывая, что ваша работа длится 30/45 минут, это может быть важно.

1 голос
/ 10 января 2011

Это зависит от:

  1. Если вам необходимо получить немедленное уведомление о завершении процесса, Comet (длинный опрос) для вас
  2. Если допустима некоторая задержка (например, система уведомляет вас через 1 минуту после завершения процесса), тогда вам нужны таймеры AJAX (опрос).

Взгляните на три примера обоих методов, основанных на ItsNat framework:

  1. Комета
  2. Таймеры AJAX
  3. Асинхронные задачи (аналогично Комета, один выстрел)

Извините, это Java

1 голос
/ 11 января 2010

Я полностью согласен с предложением Брайана Агнью, с одним возможным улучшением. Поскольку вы в основном выполняете операции проталкивания сервера, возможно, стоит рассмотреть кометный сервер . Теперь я говорю это с оговоркой - если вы действительно управляете только заданиями, которые выполняются каждые 30-45 минут, то это может быть излишним. Однако его преимущество заключается в том, что вы можете передать результаты пользователю после его завершения, а если пользователь больше не подключен, вы можете сделать что-то другое (например, отправить ему уведомление по электронной почте).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...