Хук выключения Java не работает

У меня есть продукт-сервис на Java. В нашем коде я создаю хук выключения, но когда я останавливаю службу, он не вызывает последовательно хук выключения. Из 5 стоп-вызовов он вызывал хук выключения только один раз.

Runnable shutdownHandler = new Runnable() {

    @Override
    public void run() {

        s_log.info("Shutting down thread..");
    }

};

Runtime.getRuntime().addShutdownHook(
        new Thread(shutdownHandler, "shutdownthread"));

Может ли кто-нибудь сказать мне, что может быть причиной того, что это не вызывается последовательно?


person user1108687    schedule 09.03.2016    source источник
comment
Как завершается процесс? В зависимости от того, как его убить, у него может не быть возможности запустить хук выключения. Вы никогда не должны предполагать, что он будет запущен, поскольку процесс может быть убит таким образом, что его нельзя будет запустить.   -  person Peter Lawrey    schedule 09.03.2016
comment
Это стандартный процесс Java, зарегистрированный в Windows. Я останавливаю службу из сервисной консоли Windows   -  person user1108687    schedule 09.03.2016
comment
Какой сервис-раннер вы используете? В Java нет встроенного бегуна.   -  person Andreas    schedule 09.03.2016
comment
Может быть, служба ведения журналов отключается быстрее?   -  person Holger    schedule 09.03.2016
comment
У вас есть доказательства того, что хук не работает в этих случаях? Запись сообщения не является доказательством, поскольку некоторые системы ведения журналов (например, Log4j2) имеют свои собственные перехватчики завершения работы и, таким образом, могут быть уже отключены, когда вы пытаетесь использовать метод ведения журнала.   -  person Jiri Tousek    schedule 09.03.2016
comment
У Java нет стандартного способа установки в качестве службы Windows. Используете ли вы для этого инструмент или фреймворк?   -  person Peter Lawrey    schedule 09.03.2016
comment
Мы используем сервер tomcat для запуска нашего Java-приложения, зарегистрированного как служба Windows.   -  person user1108687    schedule 09.03.2016
comment
Возможный дубликат хука отключения Java не запущен   -  person shoover    schedule 10.03.2016


Ответы (1)


Проверьте следующий код:

Runnable shutdownHandler = new Runnable() {
    @Override
    public void run() {
        System.out.println("Shutting down thread..");
    }
};

Runtime.getRuntime().addShutdownHook(
        new Thread(shutdownHandler, "shutdownthread"));

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

person Arvind Kumar Avinash    schedule 22.12.2019