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:
- Ellenőrzött folyamat
- 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.