Pridanie vypínacích hákov pre aplikácie JVM

1. Prehľad

Spustenie služby je zvyčajne ľahké. Niekedy však musíme mať plán na to, aby sme jeden elegantne odstavili.

V tomto výučbe sa pozrieme na rôzne spôsoby, ako môže byť aplikácia JVM ukončená. Potom použijeme rozhranie Java API na správu vypínacích hákov JVM. V tomto článku sa dozviete viac o vypnutí JVM v Java aplikáciách.

2. Vypnutie JVM

JVM je možné vypnúť dvoma rôznymi spôsobmi:

  1. Riadený proces
  2. Náhlym spôsobom

Riadený proces vypne JVM, keď:

  • Posledné vlákno bez démonov sa končí. Napríklad, keď dôjde k ukončeniu hlavného vlákna, JVM začne proces vypínania
  • Posiela sa signál prerušenia z OS. Napríklad stlačením Ctrl + C alebo odhlásením z OS
  • Telefonovanie System.exit () z Java kódu

Aj keď sa všetci snažíme o elegantné vypnutie, niekedy sa môže JVM vypnúť náhle a neočakávane. Spoločný podnik JVM sa náhle vypne, keď:

  • Posiela sa signál zabitia z OS. Napríklad vydaním a zabiť -9
  • Telefonovanie Runtime.getRuntime (). Halt () z Java kódu
  • Hostiteľský OS neočakávane zomrie, napríklad pri výpadku napájania alebo panike OS

3. Vypínacie háky

JVM umožňuje spustenie registračných funkcií skôr, ako dokončí svoje vypnutie. Tieto funkcie sú zvyčajne dobrým miestom na uvoľnenie zdrojov alebo iné podobné úlohy spojené s údržbou domu. V terminológii JVM tieto funkcie sa nazývajú sháčiky na hutdown.

Vypínacie háky sú v zásade inicializované, ale nezačaté vlákna. Keď JVM začne proces vypínania, spustí všetky zaregistrované spojenia v nešpecifikovanom poradí. Po spustení všetkých hákov sa JVM zastaví.

3.1. Pridanie háčikov

Na pridanie vypínacieho háku môžeme použiť Runtime.getRuntime (). AddShutdownHook () metóda:

Thread printingHook = new Thread (() -> System.out.println ("Uprostred odstávky")); Runtime.getRuntime (). AddShutdownHook (printingHook);

Tu jednoducho vytlačíme niečo na štandardný výstup predtým, ako sa JVM vypne. Ak by sme JVM odstavili takto:

> System.exit (129); Uprostred odstávky

Potom uvidíme, že háčik skutočne vytlačí správu na štandardný výstup.

JVM je zodpovedný za spustenie závitov háku. Preto, ak už bol daný hák spustený, Java vyvolá výnimku:

Thread longRunningHook = new Thread (() -> {try {Thread.sleep (300);} catch (InterruptedException ignored) {}}); longRunningHook.start (); assertThatThrownBy (() -> Runtime.getRuntime (). addShutdownHook (longRunningHook)) .isInstanceOf (IllegalArgumentException.class) .hasMessage ("Hák už beží"); 

Je zrejmé, že tiež nemôžeme zaregistrovať háčik viackrát:

Thread unfortunateHook = new Thread (() -> {}); Runtime.getRuntime (). AddShutdownHook (unfortunateHook); assertThatThrownBy (() -> Runtime.getRuntime (). addShutdownHook (unfortunateHook)) .isInstanceOf (IllegalArgumentException.class) .hasMessage ("Hook predtým zaregistrovaný");

3.2. Demontáž háčikov

Java poskytuje dvojča odstrániť spôsob odstránenia konkrétneho vypínacieho háku po jeho zaregistrovaní:

Vlákno willNotRun = nové vlákno (() -> System.out.println ("nespustí sa!")); Runtime.getRuntime (). AddShutdownHook (willNotRun); assertThat (Runtime.getRuntime (). removeShutdownHook (willNotRun)). isTrue (); 

The removeShutdownHook () metóda sa vracia pravda keď je vypínací hák úspešne odstránený.

3.3. Upozornenia

Spoločný podnik JVM spúšťa vypínacie háky iba v prípade bežných koncoviek. Takže keď vonkajšia sila náhle zabije proces JVM, nebude mať JVM šancu vykonať vypínacie háky. Rovnaký efekt bude mať tiež zastavenie kódu JVM z kódu Java:

Vlákno haltedHook = nové vlákno (() -> System.out.println ("náhle zastavené")); Runtime.getRuntime (). AddShutdownHook (haltedHook); Runtime.getRuntime (). Halt (129); 

The zastaviť metóda násilne ukončí práve bežiaci JVM. Zaregistrované vypínacie háky preto nebudú mať šancu vykonať.

4. Záver

V tomto tutoriáli sme sa pozreli na rôzne spôsoby, ktoré môže aplikácia JVM prípadne ukončiť. Potom sme na registráciu a odregistráciu vypínacích hákov použili niekoľko runtime API.

Ako obvykle je vzorový kód k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found