Добавяне на изключващи куки за JVM приложения

1. Общ преглед

Обикновено е лесно да стартирате услуга. Понякога обаче трябва да имаме план за изящно изключване.

В този урок ще разгледаме различните начини, по които приложението на JVM може да прекрати. След това ще използваме Java API за управление на куки за изключване на JVM. Вижте тази статия, за да научите повече за изключването на JVM в Java приложения.

2. Изключване на JVM

JVM може да бъде изключен по два различни начина:

  1. Контролиран процес
  2. Рязък начин

Контролиран процес изключва JVM, когато:

  • Последната не-демонова нишка завършва. Например, когато основната нишка излезе, JVM започва своя процес на изключване
  • Изпращане на сигнал за прекъсване от операционната система. Например чрез натискане на Ctrl + C или излизане от операционната система
  • Извикване на System.exit () от Java код

Въпреки че всички се стремим към изящни изключвания, понякога JVM може да се изключи по рязък и неочакван начин. JVM се изключва внезапно, когато :

  • Изпращане на сигнал за убиване от ОС. Например чрез издаване на убийство -9
  • Извикване на Runtime.getRuntime (). Halt () от Java код
  • Основната операционна система умира неочаквано, например при прекъсване на захранването или паника на операционната система

3. Куки за изключване

JVM позволява регистрирането на функции да стартира, преди да завърши изключването си. Тези функции обикновено са добро място за освобождаване на ресурси или други подобни домакински задачи. В терминологията на JVM тези функции се наричат ​​s hutdown hooks .

Изключващите куки са основно инициализирани, но не стартирани нишки . Когато JVM започне процеса на изключване, той ще стартира всички регистрирани куки в неопределен ред. След като стартирате всички куки, JVM ще спре.

3.1. Добавяне на куки

За да добавим кука за изключване, можем да използваме метода Runtime.getRuntime (). AddShutdownHook () :

Thread printingHook = new Thread(() -> System.out.println("In the middle of a shutdown")); Runtime.getRuntime().addShutdownHook(printingHook);

Тук просто отпечатваме нещо на стандартния изход, преди JVM да се изключи. Ако изключим JVM по следния начин:

> System.exit(129); In the middle of a shutdown

Тогава ще видим, че куката всъщност отпечатва съобщението на стандартен изход.

JVM е отговорен за стартиране на нишки на куката . Следователно, ако дадената кука вече е стартирана, Java ще изведе изключение:

Thread longRunningHook = new Thread(() -> { try { Thread.sleep(300); } catch (InterruptedException ignored) {} }); longRunningHook.start(); assertThatThrownBy(() -> Runtime.getRuntime().addShutdownHook(longRunningHook)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("Hook already running"); 

Очевидно е, че също не можем да регистрираме кука няколко пъти:

Thread unfortunateHook = new Thread(() -> {}); Runtime.getRuntime().addShutdownHook(unfortunateHook); assertThatThrownBy(() -> Runtime.getRuntime().addShutdownHook(unfortunateHook)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("Hook previously registered");

3.2. Премахване на куки

Java предоставя метод за двойно премахване , за да премахне определена кука за изключване след регистрирането му:

Thread willNotRun = new Thread(() -> System.out.println("Won't run!")); Runtime.getRuntime().addShutdownHook(willNotRun); assertThat(Runtime.getRuntime().removeShutdownHook(willNotRun)).isTrue(); 

Методът removeShutdownHook () връща true, когато куката за изключване е премахната успешно.

3.3. Предупреждения

JVM изпълнява куки за изключване само в случай на нормални прекратявания. Така че, когато външна сила убие внезапно процеса на JVM, JVM няма да получи шанс да изпълни куки за изключване. Освен това спирането на JVM от Java кода също ще има същия ефект:

Thread haltedHook = new Thread(() -> System.out.println("Halted abruptly")); Runtime.getRuntime().addShutdownHook(haltedHook); Runtime.getRuntime().halt(129); 

Методът на спиране принудително прекратява текущо изпълняваната JVM. Следователно регистрираните куки за изключване няма да получат шанс за изпълнение.

4. Заключение

В този урок разгледахме различни начини, по които приложението на JVM може да прекрати. След това използвахме няколко приложни програмни интерфейса (API) за изпълнение, за да регистрираме и отменим регистрацията на куки за изключване.

Както обикновено, примерният код е достъпен в GitHub.