Есть ли способ динамически перезапустить программу HelloWorld Java, которая выполняет цикл вывода вывода?
Рассмотрим следующий простой код, который навсегда печатает "Привет мир":
public class WakeMeUpSomehow {
public static void main(String[] args) {
while (true) {
try {
System.out.println( " Hi world ");
Thread.sleep(1000); //1000 milliseconds is one second.
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
}
}
Вот результат:
![enter image description here]()
Есть ли способ разработать внешнюю третью программу, которая следит за тем, чтобы эта программа заметила, когда мы ее убиваем (например, с помощью CTRL + C в командной строке); а затем эта "родительская" программа возобновляет работу "Hello World"?
Я думаю, что это может выглядеть примерно так:
![enter image description here]()
Итак, мой вопрос: как я могу имитировать такой код, который обладает такой отказоустойчивой способностью? Есть ли способ сделать это?
спасибо!
EDIT: я нашел здесь опрятную ссылку, которая имеет значение, но обращается к чему-то немного другому - Как перезапустить Java-приложение?
Ответы
Ответ 1
Завершающие перехватчики гарантированно работают при нормальных событиях завершения программы, но не при всех видах ненормального завершения, например, когда JVM убивается принудительно.
Одним из решений может быть использование пакета script:
@echo off
setlocal
start /wait java WakeMeUpSomehow
if errorlevel 1 goto retry
echo Finished successfully
exit
:retry
echo retrying...
start /wait java WakeMeUpSomehow
Ответ 2
Если это так просто, вы можете просто использовать shutdownhook.
Runtime.getRuntime().addShutdownHook(() -> {
//do whatever you want to be done when closing the program here
});
Хотя вы можете столкнуться с некоторыми проблемами, если вы хотите перезапустить программу и использовать ту же командную строку.
Ответ 3
прежде всего это сложная задача. просто попробуйте и дайте мне знать, работает ли это или нет!!!!!
public class WakeMeUpSomehow {
static class Message extends Thread {
public void run() {
try {
while(true)
{
System.out.println("Hello World from run");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
try {
Runtime.getRuntime().addShutdownHook(new Message());
while(true)
{
System.out.println("Hello World");
Thread.sleep(100);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Ответ 4
Вы можете использовать hookdown, который запускает ваше приложение еще раз. Обратите внимание на недостаток этого - ваша JVM никогда не перестанет работать, пока вы не убьете ее.
http://wrapper.tanukisoftware.com/doc/english/qna-shutdown.html
Ответ 5
Не вдаваясь в причину, почему вы так захотите:-), "надежным" способом сделать это было бы выполнение вашей "родительской" программы или пакета script в:
Вышеупомянутые подходы даже выдерживают перезагрузку компьютера!
Ответ 6
Вы должны проверить monit
. Он предоставляет множество утилит, а не просто перезапуск программы.
Например,
- Он проверяет, потребляет ли ваша программа больше памяти (возможно, из-за утечки памяти).
- Мониторинг изменений файлов.
- Перезагрузите программу, если она сработает.
- Script поддержка настройки параметров запуска.
Ответ 7
Похоже, вы хотите запустить приложение как Сервис (Windows) или Daemon (Unix).
В Java для этого обычно используется служебная оболочка. Для этого я использую Apache Commons Daemon.
Commons Daemon предоставляет ProcRun.exe в Windows для запуска вашего приложения Java как службы. Вы даже можете переименовать исполняемый файл в исполняемый файл. В Unix у вас есть JSvc для перезапуска вашего приложения Java. Я пишу тонкий универсальный API запуска в моем основном классе, который вызывается обоими исполняемыми файлами.
Это единственный способ, по моему мнению, сделать это надежно, если вам нужно сделать это в процессе производства (а не как какое-то упражнение).
Ответ 8
В Windows способ сделать это - запустить вашу программу как услугу. Это позволяет, среди прочего, возможность запуска вашей программы при запуске системы (без входа в систему) и перезапустить вашу программу, если она отключится. В наборах ресурсов Windows была предусмотрена программа SrvAny.exe, которая позволяет запускать любую программу в качестве службы.
https://support.microsoft.com/en-us/kb/137890