У меня особенно длинная операция, которая будет запущена, когда пользователь нажмет кнопку на интерфейсе, и мне интересно, что было бы лучшим способом указать это клиенту.
Операция заполняет таблицу фактов в течение нескольких лет стоимостью данных, которая займет примерно 20 минут, поэтому я не предполагаю, что интерфейс будет синхронным. Несмотря на то, что он генерирует большое количество серверов данных, мне все равно хотелось бы, чтобы все оставалось отзывчивым, поскольку данные за месяц, который пользователь просматривает в данный момент, будут обновляться довольно быстро, что не является проблемой.
Я подумал о настройке переменной сеанса после завершения операции и опроса для этой переменной сеанса. Является ли это возможным способом сделать такое? Тем не менее, я особенно обеспокоен тем, что пользователь переместился / закрыл свой браузер, а затем потерял весь статус проделанной работы.
Было бы лучше, возможно, вставить запись где-нибудь, где она будет записываться, когда она начнется и закончится. Затем создайте другой интерфейс, чтобы пользователь (или пользователи) мог отслеживать выполняемые в настоящее время / завершенные / неудачные задания?
У кого-нибудь есть ресурсы, на которые я мог бы смотреть?
Как ты это сделал?
Часть кода на стороне сервера должна появляться или взаимодействовать с процессом, который живет за пределами веб-сервера. Использование кода веб-страницы для запуска задач, которые должен выполнять демона, – это просто небрежная работа.
Вы не можете ожидать, что они будут болтаться в течение 20 минут. Даже самые совместные пользователи в мире должны уйти и сделать что-то еще, забыть и закрыть окно. Разрешение таких длительных подключений время от времени устраняет любой шанс на разумный тайм-аут HTTP и оставляет вас открытым для тривиальных DOS тоже.
Как предлагает Спенсер, используйте первый запрос для запуска процесса, который не зависит от HTTP-запроса, передает идентификатор обратно в ответ AJAX, сохраняет идентификатор в сеансе или в БД против этого пользователя или что угодно. Затем пользователь может делать все, что захочет, и не прерывает задачу. Идентификатор может использоваться для опроса статуса. Если вы сохраните его в БД, пользователь может выйти из системы, очистить свои файлы cookie, и когда они войдут в систему, вы все равно сможете получить статус задачи.
Сессия не так понятна, я бы, вероятно, создал какой-то список задач. Поэтому я могу вести учет задач для каждого пользователя. Благодаря этому дизайну я смогу показать «сделанные» задачи, чтобы пользователь знал.
Кроме того, я продолжу длительную работу из рабочего процесса. Это необходимо, потому что веб-серверы могут быть перенастроены.
И, да, я буду запрашивать статус каждые десятки секунд с сервера с помощью вызовов ajax.
У вас может быть таймер JS, который периодически пинит ваш сервер, чтобы узнать, выполнены ли какие-либо задания. Если пользователь уйдет и вернется, вы перезапустите таймер. Когда задание выполняется, вы указываете это пользователю, чтобы он мог нажать на ссылку и открыть отчет (я бы не рекомендовал сильно загружать что-то, хотя это можно сделать)
По моему опыту, лучший способ сделать это – сохранить на стороне сервера, какие отчеты запускаются для каждого пользователя, и их статусы. Затем клиент будет периодически проверять этот статус. В принципе, вместо checkStatusOf (int session), попросите клиента спросить сервер getRunningJobsFor (int userId), возвращающий все текущие задания и статусы.