natomist
@natomist

Какие существуют способы запуска длительного процесса из Tomcat?

В админке сайта присутствует пункт, по которому должна запуститься некая процедура длительностью 2-3 минуты.
Первоначально была идея реализовать её через сервлет. Но хотелось бы осуществить задел по надежности на будущее. Чтобы все корректно сработало, даже если на весь процесс потребуется 10-15 мин. Так же хотелось бы видеть некий прогресс-бар на стороне клиента, чтобы видеть этапы выполнения процесса.

Собственно вопрос: какие существуют технологии (и по каким словам гуглить), чтобы безопасно запускать длительные процедуры из Tomcat?
Спасибо.
  • Вопрос задан
  • 2586 просмотров
Пригласить эксперта
Ответы на вопрос 3
@SaertiS
Если на сервлетах все же решишь делать, то в методе обработки запроса можно вызвать сессию и установить таймаут. javax.servlet.http.HttpSession#setMaxInactiveInterval
Ответ написан
Комментировать
targetjump
@targetjump
Если Вам не нужны сокеты в плане "Так же хотелось бы видеть некий прогресс-бар", то можно обойтись
REST сервисом и ConcurrentMap<String, FutureTask<T>> в моем видении это taskId -> task. Чтобы же контролировать "длительные процедуры" можно заюзать ExecutorService со своим ThreadFactory которая продьюсит демон триды, которые можно, если так хочется, убивать по таймауту. Ну и понятно что "статус", "запуск таска" и тд реализовать на уровне сервиса.
Ответ написан
Комментировать
@relgames
Java Developer
Самый важный вопрос - хотите ли вы синхронный или асинхронный API?

При синхронном, пользователь отправляет запрос и ожидает ответа в этом же HTTP вызове.
Прогресс можно писать прямо в output stream сервлета, но нужно договориться о протоколе.
Например, писать строки вида STATUS REPORT: 80%, а клиент должен уметь различать такие строки от настоящих данных.

Если запрос разорвется, то должен быть механизм подключения к той же задаче. Это довольно сложно, но реально. Например, можно первым делом генерить некий ID и выдавать его в первых строках, и если соединение рвется, клиент может переподключиться с этим же ID.

При асинхронном API генерируется ID, задача ставится в очередь, а клиент получает этот ID и HTTP вызов завершается. Потом клиент должен периодически опрашивать уже другой API (например, getResult(id) ), и если результата еще нет, этот API может возвращать что-то типа "NOT READY, STATUS 85%" в хедерах.

Подходы можно комбинировать - запуск задачи может быть асинхронным, а getResult - синхронным.

Конкретная реализация зависит от многих факторов. Можно просто в Executor добавлять задачу, а статус писать в какую-нибудь очередь. Можно на JMS делать. Можно вообще другой процесс запускать и общаться с ними через std in/out.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Искра Екатеринбург
от 80 000 до 100 000 ₽
Art gorka Санкт-Петербург
от 60 000 ₽
от 40 000 до 60 000 ₽