Деякі питання про запуск ProcessBuilder через веб-програму

Я пишу веб-програму, яка в основному дозволяє користувачам запускати скрипти оболонки з параметрами, які вони вводять через різні форми. Після виконання деяких досліджень я вважаю ProcessBuilder найкращим способом запуску сценаріїв оболонки, однак у мене є деякі умови, які мені потрібно зустрітися, і сподівався, що деякі інші зможуть сказати мені, якщо я думаю про правильні лінії.

Сценарії, які будуть зніматися, можуть буквально зайняти кілька годин, щоб запустити. Очевидно, що я не можу призупинити програму і чекати цього довго. Отже, мені цікаво, якщо нитки є відповіддю на цю проблему? Я не дуже досвідчений, використовуючи теми та шукаю поради. Чи повинен я почати роботу з ProcessBuilder у новій темі, щоб основна веб-програма продовжувала працювати? Чи буде це навіть працювати? Це так просто, як просто оголосити нову гілку і присвоїти йому процесу будівельника? Чи повинен я турбуватися про те, що різні потоки запускаються або створюються? Просто не впевнені в тому, про що слід звернути увагу, або про які підводні явища слід пам'ятати.

Крім того, мені дуже потрібен спосіб, щоб хоча б перевірити стан процесу, коли він працює. Вимоги вимагати певного способу показати, наскільки далеко це процес, але я не знаю, що це можливо. Я вважаю, що здатний принаймні показати, що він все ще працює, повинен бути прийнятним. Як я хотів би знайти це?

Для деяких додаткових відомостей це веб-додаток Java/Spring і буде працювати під певним ароматом Unix. Дякую за будь-які думки та допомогу.

1

1 Відповіді

Ви могли б реалізувати щось на зразок JobManager та Job .

Job може бути Runnable , що має ProcessBuilder . У методі run він запускає процес ( ProcessBuilder.start ), чекає його виходу та закликає повернутися до JobManager після завершення, можливо повернення статусу завершення процесу.

JobManager створює Jobs (кожен з них у новій Thread ), зберігає колекцію поточних завдань (і, можливо, колекцію нещодавно закінчених робіт, може бути список невдалих робочих місць). Клієнти можуть дати роботам JobManager виконувати та запитати за статусом (запущений, завершений, не виконаний) з усіх завдань або певної роботи.

Що стосується статусу процесу, то робота може мати початковий, кінцевий та вихідний змінні та відповідні методи отримання. Ви можете повернути їх до клієнта, щоб відобразити таблицю статусу завдання.

Ваш метод Job.run може виглядати приблизно так.

public void run() {
  startTime = System.currentTimeMillis();  
  process = processBuilder.start();

 //spawn threads to consume process output streams
 //even if you're not going to read them

  while (running) {
    try {
      process.waitFor();
      running = false;
    } catch (InterruptedException e) {
     //you could stop a process by interrupting it's Job thread
      process.destroy();
    }
  }
  exitStatus = process.exitValue();
  endTime = System.currentTimeMillis();
  jobManager.onExit(this);
}

Що стосується "% complete", це буде тільки можливо, якщо у вас є якийсь спосіб його вимірювання.

Якщо завдання повинно завершитися протягом певного часу, ви можете використовувати його як грубий спосіб звітування про очікуваний час завершення/відсоток завершення.

Або, можливо, ви можете захопити висновок процесів, використовуючи його, щоб встановити змінну percentComplete у своєму Job. Наприклад, коли ви побачите повідомлення X в ouput, встановіть percentComplete = 25%. Це означало б реалізацію спеціального коду для кожного типу скрипту - можливо, підкласу Job або дайте Job змінній члену, відповідальну за синтаксичний аналіз результатів.

3
додано
JobManager це просто ім'я, я боюся. Google для "Управління процесом Java" або подібним буде корисним. Можливо, допоможе Apache Commons Exec [ commons.apache.org/exec/] ? Я сам не використовував це.
додано Автор sudocode, джерело
Дуже розумна ідея, дякую вам за вхід. Я обов'язково буду читати більше на Threads і такий він з'являється, але це, схоже, найрозумніший спосіб обробки того, що я хочу. Чи є JobManager просто ім'ям, чи це дійсно клас, я можу десь подивитися? Будь-які інші думки про те, де я можу піти, щоб подивитися на деякі приклади щось на зразок цього?
додано Автор cardician, джерело
Ще раз спасибі дуже сильно. Я розгляну це і почнуть робити більше читання, і, сподіваюсь, зможу отримати робоче рішення. Ваша відповідь напевно дасть мені кращу увагу.
додано Автор cardician, джерело
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників