Делегирование рабочей нагрузки из сервлета Java

Я пытаюсь создать задачу сервлета Java, которая имеет время выполнения ~15-20 минут, которое принимает аргументы из формы HTML. У меня есть пара вопросов по этому поводу:

  1. Будет ли задача продолжать выполняться даже после того, как пользователь закроет браузер? Я гуглил это и похоже процесс продолжит выполняться даже после закрытия браузера. Я просто хочу это подтвердить.

  2. В поисках ответа на поставленный выше вопрос я натолкнулся на пост (или пару из них), в котором говорилось, что для таких "интенсивных" (я бы посчитал мои интенсивных задач, поскольку для их выполнения требуется около 15-20 минут) это лучше иметь отдельную программу для запуска задачи, чем содержать ее в программе сервлета. Итак, я просто выполнить другую программу Java из класса сервлетов?

А теперь по моему последнему вопросу, будут ли обрабатываться запросы нескольких пользователей независимо друг от друга? Например, будет ли сервлет иметь отдельный поток или экземпляр для каждого запроса? Если это так, приведет ли мое выполнение другой Java-программы из класса сервлетов к каким-либо проблемам?

1 ответ

Решение

Есть несколько вопросов для обсуждения, каждый со своим (частью) решением:

  • Вы действительно хотите, чтобы задание продолжалось, если браузер закрывается? Создайте новый поток для задачи (попытка записи в выходной поток браузера, когда браузер уже закрыт, приведет к тому, что поток умрет в исключении). См. Исполнитель.
  • Вы хотите, чтобы параллельные запросы обрабатывались параллельно? Сколько параллельно? Смотрите ThreadPoolExecutor
  • Хотите ли вы оставить отзыв браузеру (пользователю) во время долгого выполнения задания? Смотрите асинхронные сервлеты

Контейнер сервлета обеспечит параллельную обработку параллельных запросов, каждый в своем собственном потоке. Но они поделятся экземпляром класса Servlet. Поэтому вы должны сделать свой поток кода безопасным.

О запуске "отдельной Java-программы" или сохранении задачи в сервлете: рекомендуется разделять разные задачи в программе по разным разделам. Создать новый класс для вашей длительной задачи лучше, чем хранить его в классе сервлета. См разделение проблем.

Другие вопросы по тегам