Запустить процесс в HttpSession и передать его другому «владельцу» до истечения сеанса? - PullRequest
0 голосов
/ 06 марта 2012

Я (пытаюсь) разработать систему веб-приложений, которая обрабатывает пользовательские запросы и вычисления и передает их исполняемым файлам (на заказ) на сервере с помощью расширений Threads и Runtime.exec () (в Linux и / или Windows). ). Эти вычисления могут занимать много времени и могут превышать продолжительность HttpSession Если это происходит, и сеанс истекает, поток / процесс также умирает вместе с HttpSession (верно?).

Мой вопрос: есть ли способ, например, запустить процесс в течение сеанса и передать его независимому от сеанса процессу?

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

Я благодарен за любые идеи и советы!

Ответы [ 2 ]

1 голос
/ 06 марта 2012

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

Я бы сделал следующее:

  • Когда приходит запрос на новое вычисление, я создаю уникальный идентификатор и сохраняю его в БД как «ожидающий вычисления» с идентификатором пользователя.
  • Затем я собираю данные для запроса и помещаю их в очередь JMS, которая будет запланирована для расчета.
  • Ваш веб-контейнер может вернуть этот идентификатор в веб-браузер.
  • Веб-браузер может использовать идентификатор для возврата на веб-сервер с сообщением «Расчет ID уже выполнен?» Сервер может проверить базу данных и посмотреть, все еще ли состояние «в ожидании».
  • На вашей веб-странице вы можете отобразить какое-нибудь сообщение «обработка ...» и индикатор выполнения, который будет периодически обновляться и проверять, продолжается ли вычисление (скажем, обновление каждые 10 секунд). Это сохранит ваш HttpSession в активном состоянии (хотя в этом нет необходимости, поскольку пользователь может снова войти в систему и проверить идентификатор, или, если вы сохранили имя пользователя в записи БД, вы увидите все «ожидающие» вычисления пользователя).
  • Расчет будет выполняться отдельным приложением, которое в основном прослушивает входящие сообщения в очереди JMS / MQ, а затем создает новый поток. Теперь это может быть на том же компьютере или на другом компьютере (и использование JMS позволяет гибко использовать конфигурацию JMS или несколько «рабочих» компьютеров, прослушивающих сообщения JMS для выполнения вычислений.
  • Как только вычисление будет завершено, «рабочий» упакует результат и отправит ответное сообщение JMS (включая ID).
  • Вернувшись на ваш сервер, вы можете получить управляемый сообщениями компонент, который вставит результаты в базу данных и изменит статус базы данных на «готово» и сделает результаты доступными.
  • Теперь, когда веб-страница обновляется, поскольку результаты доступны, вы можете перенаправить на страницу результатов (и получить результаты из базы данных).

Преимущества использования JMS:

  • Сообщения могут быть сохранены, переслать, если есть проблема.
  • Соответствие спецификации Java EE

Преимущества хранения результатов расчетов в БД:

  • Посмотрите на исторические расчеты
  • Если расчет идемпотентен, вы можете посмотреть результат предыдущих расчетов.

Надеюсь, это поможет.

1 голос
/ 06 марта 2012

Вам следует использовать библиотеку Job Scheduling, например Quartz , чтобы ваши рабочие места не зависели от HttpSession

...