Как вызвать крючок выключения из основного класса топологии шторма?

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

//Shutdown hook
    Runtime.getRuntime().addShutdownHook(new Thread() {
        public void run() {
             System.out.println("Inside shutdown hook.");
             Utils.sleep(1000000);
             cluster.killTopology("netra-fault-management");
             cluster.shutdown();
             logger.info("Shutting down Topology.");
        }
    });

Вот мой хук выключения, который находится в основном методе класса толпологии. Я запускаю его из командной строки, и когда я нажимаю Ctrl + C, ожидается, что он запустит этот хук выключения, но он просто закрывается, и код хука не вызывается. Есть ли у кого-нибудь приятель идеи о том, как запустить его на ctrl+c (SIGINT).


person Swapnil1988    schedule 04.02.2015    source источник


Ответы (3)


С Runtime#addShutdownHook это возможно.
Проблема должна быть вызвана Utils.sleep(1000000);. Вы не должны «засыпать» поток выключения, поскольку виртуальная машина Java (и другие приложения) не позволяет этого. Крюк выключения предназначен для вызова, когда приложение собирается закрыть, чтобы сохранить важные вещи или выгрузить ресурсы и т. д. Виртуальная машина Java завершит работу через несколько секунд, даже если поток не будет выполнен полностью.

В редких случаях виртуальная машина может прервать работу, то есть перестать работать без корректного завершения работы. Это происходит, когда виртуальная машина завершается извне, например сигналом SIGKILL в Unix или вызовом TerminateProcess в Microsoft Windows. Виртуальная машина также может прервать работу, если собственный метод пойдет не так, например, из-за повреждения внутренних структур данных или попытки доступа к несуществующей памяти. Если виртуальная машина аварийно завершает работу, то нельзя гарантировать, будут ли запущены какие-либо перехватчики выключения.

Из класса JavaDoc для среды выполнения. Иногда хук выключения не вызывается. Удачи!

person Jeremy    schedule 04.02.2015
comment
Привет, Джереми, спасибо за ответ, но это не работает. Я прокомментировал весь код и просто поместил один sysout и сообщение журнала, но до сих пор не смог вызвать перехватчик выключения... - person Swapnil1988; 04.02.2015
comment
Какую операционную систему ты используешь? - person Jeremy; 04.02.2015

См. Натан Марц, комментирующий аналогичный вопрос несколько лет назад, я полагаю, что поведение не изменилось:

https://groups.google.com/forum/#!topic/storm-user/A4-uFS6px2Y

Storm останавливает рабочие процессы с помощью SIGKILL, JVM не будет выполнять хук выключения при таких обстоятельствах (как это было бы для SIGINT).

person Derek Troy-West    schedule 10.06.2015

Насколько я понял из этого и это, они внедрили изменение, позволяющее срабатывать перехватчику выключения, но код перехватчиков ограничено одной секундой, поэтому подходит для некоторых сценариев. Тем не менее, я не проверял лично, так как этого недостаточно для моего случая, который представляет собой загрузку буфера. Но есть альтернативный подход для меня, что я собираюсь реализовать.

person Sasha    schedule 28.01.2016