Если Quartz JVM завершается нормально, вы можете просто уничтожить процессы в блоке finally. Это может устранить необходимость в крюке отключения. Хук отключения может не работать при аварийном завершении JVM. Состояние Javadocs времени выполнения,
Если виртуальная машина прерывает работу, то нельзя гарантировать, будут ли запущены какие-либо перехватчики завершения работы.
Вот модифицированный код (я добавил время ожидания и вызов метода для ожидания завершения процесса)
private static final long TIMEOUT_MS = 60000;
Process process = Runtime.getRuntime().exec(command);
try
{
while (true)
{
Thread thread1 = new Thread(new ReaderThread(process.getInputStream()));
Thread thread2 = new Thread(new ReaderThread(process.getErrorStream()));
thread1.start();
thread2.start();
process.waitFor();
thread1.join(TIMEOUT_MS);
thread2.join(TIMEOUT_MS);
...
}
} finally {
process.destroy();
}
В целом я обнаружил, что процессы, порожденные Java, неуклюжи и не очень устойчивы, как вы, вероятно, обнаружили, учитывая необходимость двух ReaderThreads. В частности, подпроцессы, которые замораживаются, могут быть трудно завершены изнутри Java. В качестве последнего средства вы можете использовать команду Windows " taskkill ", чтобы убрать процесс из командной строки или запланированной задачи:
taskkill / IM MySpawnedProcess.exe