Вы можете реализовать что-то вроде JobManager
и Job
.
A Job
может быть Runnable
с ProcessBuilder
. В его методе run
он запускает процесс (ProcessBuilder.start
), ожидает его завершения и вызывает обратно к JobManager
после завершения, возможно возвращая статус завершения процесса.
JobManager
создает Jobs
(каждый в новом Thread
), поддерживает набор текущих заданий (и, возможно, набор недавно выполненных заданий, может быть список невыполненных заданий). Клиенты могут давать задания JobManager для выполнения и запрашивать состояние (запущен, завершен, не выполнен) всех заданий или определенного задания.
Что касается статуса процесса, задание может иметь переменные startTime, endTime и exitStatus и связанные методы get. Вы можете вернуть их клиенту для отображения таблицы статуса задания.
Ваш 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", это будет возможно, только если у вас есть какой-то способ его измерения.
Если задача должна быть выполнена в течение определенного времени, вы можете использовать это как грубый способ сообщить ожидаемое время завершения / процент выполнения.
Или, возможно, вы могли бы захватить выходные данные процессов, используя это для установки переменной процентаComplete в вашем задании. Например, когда вы видите «сообщение X» в выводе, установите процентComplete = 25%. Это будет означать реализацию пользовательского кода для каждого типа скрипта - может быть, подкласс Job или дать Job переменную-член, отвечающую за анализ выходных данных.