запустить отдельный фоновый процесс на веб-сервере Java - PullRequest
0 голосов
/ 16 января 2012

В основном я хочу использовать веб-страницу jsp, поэтому в Java для запуска (менеджера) другого фонового процесса (может быть что угодно) на сервере Linux.

Их нужно запускать от имени другого пользователя, чем сам веб.

Интересно, какие у меня есть варианты?


Я только что узнал, что

Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("linux command");

может работать.

Но я не знаю, будет ли только что запущенный (дочерний?) Процесс полностью отделен от процесса сервлета java? И можно ли запустить его под другим аккаунтом?

1 Ответ

0 голосов
/ 16 января 2012

Использование Runtime в предположительно пожизненном веб-приложении Java EE - плохая идея.

Прежде всего, новый процесс, созданный с помощью Runtime, будет выделять столько новой динамической памяти, сколько и текущая среда Java. Это не обязательно может нанести вред внутри простого Java-приложения, которое использует по умолчанию 64 МБ или чего-то еще, но в веб-приложении Java EE, которое обычно выделяет память в гигабайтах, это будет пустой тратой памяти.

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

Наконец, вы не можете изменить пользователя, выполняющего процесс. Это всегда будет тот же пользователь, который выполнил текущую среду выполнения Java.

У вас есть в основном 2 варианта:

  1. Не используйте Java для этого вообще. Например, просто выполняйте работу, используя предоставленный платформой менеджер фоновых заданий, такой как Cron на платформах на основе Unix и планировщик задач на платформах на базе Windows.

  2. Сделайте это на 100% Java. Выполните ту же цель, используя чистую Java, без необходимости порождать процесс. При необходимости вы можете управлять фоновыми заданиями, используя ExecutorService API или стороннюю библиотеку, такую ​​как Quartz. Обратите внимание, что даже для этих заданий все еще требуется выполнение 100% чистого кода Java.

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