Каков наилучший способ программного перезапуска приложения Java под Ubuntu? - PullRequest
1 голос
/ 22 декабря 2009

У меня есть приложение с несколькими запущенными потоками. Каждый из них обернут катушкой (Throwable), которую я могу использовать, если случится что-то неожиданное. Каков наилучший способ перезапустить само приложение под Ubuntu / Linux. Я нашел этот проект " Java Service Wrapper ", есть опыт работы с ним?

Я попробовал опции -XX: OnError, но, похоже, он не работает (Java (TM) SE Runtime Environment (build 1.6.0_16-b01))

Ответы [ 2 ]

4 голосов
/ 22 декабря 2009

Не могли бы вы запустить его из пакетного файла (который зацикливается) и использовать его в System.exit (1)?

Если это так, вы можете проверить уровень ошибки в пакетном файле и, если он равен 1, вернуться к началу и перезапустить программу, но если он равен нулю, выйти из пакетного файла.

Edit: Вы хотите вызвать «Сброс» извне (из unix?)

Если это так, мое предложение будет следующим:

  1. Создать параметр командной строки с именем -restart
  2. При запуске без командной строки откройте сокет на заранее установленном высоком порту (32123?) И прослушайте соединение как часть запуска вашего приложения.
  3. Когда вы получаете соединение с некоторой ключевой строкой, переданной в него, выполните System.exit (1);
  4. При запуске с -restart вместо обычного запуска подключитесь к этому порту, отправьте правильную строку ключа и выйдите.
  5. Если ваша процедура перезапуска не может подключиться, обязательно напечатайте сообщение об ошибке, говорящее, что демон не работает.

Существуют и другие способы отправки сообщения существующему процессу, но сокет, вероятно, самый простой - это всего лишь несколько строк кода. Другой - опрос о существовании файла в каком-то абсолютном месте, а также поиск PID и его уничтожение.

Сокет как дополнительное преимущество независимости от платформы.

0 голосов
/ 23 декабря 2009

Вы должны разработать механизм для обработки множества потоков, перехватить проблемы и определить, можете ли вы перезапустить сбойный поток изнутри Java .

Единственное место, где операционная система имеет значение, это если ваше приложение полностью закрывается и требует перезапуска. Пока у вас есть некоторая часть вашего приложения, вы не должны учитывать это.

...