Leállító kampók hozzáadása a JVM alkalmazásokhoz

1. Áttekintés

Általában könnyű elindítani egy szolgáltatást. Néha azonban szükségünk van egy tervre, amellyel kecsesen leállíthatjuk.

Ebben az oktatóanyagban megvizsgáljuk a JVM-alkalmazás megszüntetésének különböző módjait. Ezután Java API-kat használunk a JVM leállítási kampóinak kezelésére. Kérjük, olvassa el ezt a cikket, ha többet szeretne megtudni a JVM leállításáról a Java alkalmazásokban.

2. JVM leállítás

A JVM kétféle módon állítható le:

  1. Ellenőrzött folyamat
  2. Hirtelen módon

Az ellenőrzött folyamat leállítja a JVM-et, ha:

  • Az utolsó nem démon szál véget ér. Például, amikor a fő szál kilép, a JVM megkezdi a leállítási folyamatot
  • Megszakítási jel küldése az operációs rendszerről. Például a Ctrl + C megnyomásával vagy az OS kijelentkezésével
  • Hívás System.exit () Java kódból

Noha mindannyian kecses leállításokra törekszünk, néha a JVM hirtelen és váratlan módon leállhat. A JVM hirtelen leáll, amikor:

  • Ölési jel küldése az operációs rendszerről. Például a ölni -9
  • Hívás Runtime.getRuntime (). Halt () Java kódból
  • A fogadó operációs rendszer váratlanul meghal, például áramkimaradás vagy operációs rendszer pánikja miatt

3. Leállító kampók

A JVM lehetővé teszi a regisztrációs funkciók futtatását, mielőtt befejezné a leállítást. Ezek a funkciók általában jó helyek az erőforrások felszabadítására vagy más hasonló házkezelési feladatokra. A JVM terminológiájában ezeket a függvényeket s-nek nevezzükhutdown kampók.

A leállítási kampók alapvetően inicializált, de el nem indított szálak. Amikor a JVM megkezdi leállítási folyamatát, az összes regisztrált kampót nem meghatározott sorrendben indítja el. Az összes kampó lefuttatása után a JVM leáll.

3.1. Horgok hozzáadása

Leállítási kampó hozzáadásához használhatjuk a Runtime.getRuntime (). AddShutdownHook () módszer:

Szál nyomtatásaHook = új Szál (() -> System.out.println ("Leállítás közepén")); Runtime.getRuntime (). AddShutdownHook (printingHook);

Itt egyszerűen kinyomtatunk valamit a standard kimenetre, mielőtt a JVM leállítaná önmagát. Ha a következőképpen állítjuk le a JVM-et:

> System.exit (129); Egy leállás közepén

Aztán látni fogjuk, hogy a horog valóban kinyomtatja az üzenetet a normál kimenetre.

A JVM felelős a kampós szálak elindításáért. Ezért, ha az adott horog már elindult, a Java kivételt vet:

Téma longRunningHook = new Téma (() -> {próbáld ki {Thread.sleep (300);} catch (InterruptedException figyelmen kívül hagyva) {}}); longRunningHook.start (); assertThatThrownBy (() -> Runtime.getRuntime (). addShutdownHook (longRunningHook)) .isInstanceOf (IllegalArgumentException.class) .hasMessage ("A kampó már fut"); 

Nyilvánvalóan nem is regisztrálhatunk horgot többször:

Szál unfortunateHook = új szál (() -> {}); Runtime.getRuntime (). AddShutdownHook (unfortunateHook); assertThatThrownBy (() -> Runtime.getRuntime (). addShutdownHook (unfortunateHook)) .isInstanceOf (IllegalArgumentException.class) .hasMessage ("Hook korábban regisztrált");

3.2. Horgok eltávolítása

A Java ikert kínál eltávolítani módszer egy adott leállítóhorog eltávolítására regisztráció után:

Szál willNotRun = új Szál (() -> System.out.println ("Nem fog futni!")); Runtime.getRuntime (). AddShutdownHook (willNotRun); assertThat (Runtime.getRuntime (). removeShutdownHook (willNotRun)). isTrue (); 

A removeShutdownHook () metódus visszatér igaz amikor a leállító kampót sikeresen eltávolították.

3.3. Figyelmeztetések

A JVM csak normál lezárások esetén futtatja a leállító kampókat. Tehát, ha egy külső erő hirtelen megöli a JVM folyamatot, a JVM nem kap esélyt a leállítási kampók végrehajtására. Ezenkívül a JVM Java kódból történő leállításának is ugyanaz a hatása:

Szál haltedHook = new Szál (() -> System.out.println ("Hirtelen leállt")); Runtime.getRuntime (). AddShutdownHook (haltedHook); Runtime.getRuntime (). Halt (129); 

A Állj metódus erőszakkal megszünteti a jelenleg futó JVM-et. Ezért a regisztrált leállító kampók nem kapnak esélyt a végrehajtásra.

4. Következtetés

Ebben az oktatóanyagban megvizsgáltuk a JVM-alkalmazás megszüntetésének különböző módjait. Ezután néhány futásidejű API-t használtunk a leállítási kampók regisztrálásához és törléséhez.

Szokás szerint a mintakód elérhető a GitHubon.


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