Dodavanje kuka za isključivanje za JVM aplikacije

1. Pregled

Obično je lako pokrenuti uslugu. Međutim, ponekad moramo imati plan za graciozno gašenje.

U ovom uputstvu ćemo pogledati različite načine na koje JVM aplikacija može završiti. Zatim ćemo koristiti Java API-je za upravljanje kukama za isključivanje JVM-a. Pogledajte ovaj članak da biste saznali više o isključivanju JVM-a u Java programima.

2. JVM isključenje

JVM se može isključiti na dva različita načina:

  1. Kontrolirani proces
  2. Nagli način

Kontrolirani postupak isključuje JVM kada:

  • Posljednja ne-daemon nit završava. Na primjer, kada glavna nit izađe, JVM započinje svoj proces isključivanja
  • Slanje signala prekida iz OS-a. Na primjer, pritiskom na Ctrl + C ili odjavom s OS-a
  • Pozivanje System.exit () iz Java koda

Iako svi težimo gracioznim isključenjima, ponekad se JVM može naglo i neočekivano isključiti. JVM se naglo isključuje kada:

  • Slanje signala za ubojstvo iz OS-a. Na primjer, izdavanjem a ubiti -9
  • Pozivanje Runtime.getRuntime (). Halt () iz Java koda
  • Domaćin OS neočekivano umire, na primjer, u prekidu napajanja ili OS panike

3. Kuke za isključivanje

JVM omogućuje pokretanje funkcija registriranja prije nego što dovrši svoje isključivanje. Te su funkcije obično dobro mjesto za oslobađanje resursa ili druge slične kućne zadatke. U JVM terminologiji, te se funkcije nazivaju skuke za zatvaranje.

Kuke za isključivanje u osnovi su inicijalizirane, ali nepokrenute niti. Kada JVM započne svoj postupak isključivanja, pokrenut će sve registrirane kuke u neodređenom redoslijedu. Nakon pokretanja svih kuka, JVM će se zaustaviti.

3.1. Dodavanje udica

Da bismo dodali kuku za isključivanje, možemo koristiti Runtime.getRuntime (). AddShutdownHook () metoda:

Thread printingHook = new Thread (() -> System.out.println ("Usred isključivanja")); Runtime.getRuntime (). AddShutdownHook (printingHook);

Ovdje jednostavno ispisujemo nešto na standardni izlaz prije nego što se JVM isključi. Ako isključimo JVM na sljedeći način:

> System.exit (129); Usred isključenja

Tada ćemo vidjeti da kuka zapravo ispisuje poruku na standardni izlaz.

JVM je odgovoran za pokretanje navoja kuke. Stoga, ako je zadana udica već pokrenuta, Java će izbaciti iznimku:

Tema longRunningHook = nova nit (() -> {try {Thread.sleep (300);} catch (InterruptedException ignorisana) {}}); longRunningHook.start (); assertThatThrownBy (() -> Runtime.getRuntime (). addShutdownHook (longRunningHook)) .isInstanceOf (IllegalArgumentException.class) .hasMessage ("Kuka je već pokrenuta"); 

Očito je da također ne možemo registrirati udicu više puta:

Tema nesretniHook = nova nit (() -> {}); Runtime.getRuntime (). AddShutdownHook (nesretniHook); assertThatThrownBy (() -> Runtime.getRuntime (). addShutdownHook (nesretniHook)) .isInstanceOf (IllegalArgumentException.class) .hasMessage ("Kuka prethodno registrirana");

3.2. Uklanjanje kuka

Java nudi blizanca ukloniti metoda uklanjanja određene kuke za isključivanje nakon registracije:

Tema willNotRun = nova nit (() -> System.out.println ("Neće se pokrenuti!")); Runtime.getRuntime (). AddShutdownHook (willNotRun); assertThat (Runtime.getRuntime (). removeShutdownHook (willNotRun)). isTrue (); 

The removeShutdownHook () metoda se vraća pravi kada se kuka za isključivanje uspješno ukloni.

3.3. Upozorenja

JVM pokreće kuke za isključivanje samo u slučaju normalnih završetka. Dakle, kada vanjska sila naglo ubije JVM proces, JVM neće dobiti priliku izvršiti kuke za isključivanje. Uz to, zaustavljanje JVM-a s Java koda također će imati isti učinak:

Tema zaustavljenaHook = nova nit (() -> System.out.println ("Naglo zaustavljeno")); Runtime.getRuntime (). AddShutdownHook (zaustavljeniHook); Runtime.getRuntime (). Halt (129); 

The zaustaviti metoda prisilno prekida trenutno pokrenut JVM. Stoga registrirane kuke za isključivanje neće dobiti priliku za izvršenje.

4. Zaključak

U ovom smo tutorijalu pogledali različite načine na koje JVM aplikacija može završiti. Zatim smo koristili nekoliko API-ja za izvršavanje kako bismo registrirali i poništili registraciju zaustavnih kuka.

Kao i obično, uzorak koda dostupan je na GitHubu.