Isključite aplikaciju Spring Boot

1. Pregled

Upravljanje životnim ciklusom aplikacije Spring Boot vrlo je važno za sustav koji je spreman za proizvodnju. Spremnik Spring upravlja stvaranjem, inicijalizacijom i uništavanjem svih graha uz pomoć ApplicationContext.

Naglasak ovog pisanja je faza uništavanja životnog ciklusa. Točnije, pogledati ćemo različite načine za isključivanje aplikacije Spring Boot.

Da biste saznali više o postavljanju projekta pomoću Spring Boot-a, pogledajte članak Spring Boot Starter ili prijeđite na konfiguraciju Spring Boot-a.

2. Krajnja točka isključenja

Prema zadanim postavkama sve su krajnje točke omogućene u Spring Boot Application, osim /ugasiti; ovo je, naravno, dio Pokretač krajnje točke.

Evo ovisnosti Mavena za postavljanje ovih:

 org.springframework.boot opruga-pokretač-pokretač-pokretač 

A, ako želimo postaviti i sigurnosnu podršku, trebamo:

 org.springframework.boot spring-boot-starter-security 

Na kraju, omogućujemo krajnju točku isključivanja u primjena.svojstva datoteka:

management.endpoints.web.exposure.include = * management.endpoint.shutdown.enabled = true krajnje točke.shutdown.enabled = true

Imajte na umu da također moramo izložiti sve krajnje točke aktuatora koje želimo koristiti. U gornjem primjeru izložili smo sve krajnje točke aktuatora koje će uključivati /ugasiti krajnja točka.

Da bismo isključili aplikaciju Spring Boot, jednostavno pozivamo POST metodu poput ove:

curl -X POST localhost: priključak / pokretač / isključivanje

U ovom pozivu, luka predstavlja port aktuatora.

3. Zatvorite kontekst aplikacije

Također možemo nazvati Zatvoriti() metoda izravno koristeći kontekst aplikacije.

Počnimo s primjerom stvaranja konteksta i njegovog zatvaranja:

ConfigurableApplicationContext ctx = novi SpringApplicationBuilder (Application.class) .web (WebApplicationType.NONE) .run (); System.out.println ("Proljetna pokrenuta aplikacija pokrenuta"); ctx.getBean (TerminateBean.class); ctx.close ();

To uništava sav grah, oslobađa brave, a zatim zatvara tvornicu graha. Da bismo provjerili isključivanje aplikacije, koristimo standardni povratni poziv životnog ciklusa Springa s @PreDestroy napomena:

javna klasa TerminateBean {@PreDestroy javna praznina onDestroy () baca izuzetak {System.out.println ("Proljetni spremnik je uništen!"); }}

Moramo dodati i grah ove vrste:

@Configuration javna klasa ShutdownConfig {@Bean public TerminateBean getTerminateBean () {return new TerminateBean (); }}

Evo rezultata nakon pokretanja ovog primjera:

Pokrenuta aplikacija Spring Boot (Zatvoreno) [email protected] DefaultLifecycleProcessor - Zaustavljanje graha u fazi 0 Neregistriranje graha izloženih JMX-u prilikom gašenja Spring Container je uništen!

Ovdje je važno imati na umu: dok zatvara kontekst aplikacije, nadređeni kontekst ne utječe zbog zasebnih životnih ciklusa.

3.1. Zatvorite trenutni kontekst aplikacije

U gornjem primjeru stvorili smo podređeni kontekst aplikacije, a zatim koristili Zatvoriti() metoda da se to uništi.

Ako želimo zatvoriti trenutni kontekst, jedno je rješenje jednostavno nazvati aktuator /ugasiti krajnja točka.

Međutim, možemo stvoriti i vlastitu prilagođenu krajnju točku:

@RestController javna klasa ShutdownController implementira ApplicationContextAware {privatni kontekst ApplicationContext; @PostMapping ("/ shutdownContext") javna praznina shutdownContext () {((ConfigurableApplicationContext) kontekst) .close (); } @Override public void setApplicationContext (ApplicationContext ctx) baca BeansException {this.context = ctx; }}

Ovdje smo dodali kontroler koji implementira ApplicationContextAware sučelje i nadjačava metodu postavljanja kako bi se dobio trenutni kontekst aplikacije. Zatim, u metodi mapiranja, jednostavno pozivamo Zatvoriti() metoda.

Tada možemo nazvati našu novu krajnju točku kako bismo isključili trenutni kontekst:

curl -X POST localhost: port / shutdownContext

Naravno, ako dodate takvu krajnju točku u stvarnu aplikaciju, poželjet ćete je i osigurati.

4. Izlaz SpringApplication

SpringApplication registrira a ugasiti spojite se s JVM-om kako biste bili sigurni da aplikacija izlazi na odgovarajući način.

Grah može primijeniti ExitCodeGenerator sučelje za povratak određenog koda pogreške:

ConfigurableApplicationContext ctx = novi SpringApplicationBuilder (Application.class) .web (WebApplicationType.NONE) .run (); int exitCode = SpringApplication.exit (ctx, novi ExitCodeGenerator () {@Override public int getExitCode () {// vrati kôd pogreške return 0;}}); System.exit (izlazni kod);

Isti kod s primjenom Java 8 lambdas:

SpringApplication.exit (ctx, () -> 0);

Nakon poziva na System.exit (izlazni kod), program završava s povratnim kodom 0:

Proces je završen s izlaznim kodom 0

5. Ubijte postupak aplikacije

Napokon, također možemo isključiti Spring Boot Application izvan aplikacije pomoću bash skripte. Naš prvi korak za ovu opciju je da kontekst aplikacije napiše svoj PID u datoteku:

SpringApplicationBuilder app = novi SpringApplicationBuilder (Application.class) .web (WebApplicationType.NONE); app.build (). addListeners (novi ApplicationPidFileWriter ("./ bin / shutdown.pid")); app.run ();

Zatim stvorite a isključivanje.bat datoteka sljedećeg sadržaja:

ubiti $ (cat ./bin/shutdown.pid)

Izvršenje isključivanje.bat izvlači ID procesa iz isključivanje.pid datoteku i koristi ubiti naredba za prekid aplikacije za pokretanje.

6. Zaključak

U ovom brzom opisu opisali smo nekoliko jednostavnih metoda koje se mogu upotrijebiti za isključivanje tekuće aplikacije Spring Boot.

Iako je na programeru da odabere odgovarajuću metodu; sve ove metode treba koristiti dizajnirano i namjerno.

Na primjer, .Izlaz() preferira se kada trebamo proslijediti kôd pogreške u drugo okruženje, recimo JVM za daljnje radnje. KoristećiPrimjenaPID daje veću fleksibilnost, jer također možemo pokrenuti ili ponovno pokrenuti aplikaciju uz upotrebu bash skripte.

Konačno, /ugasitije ovdje da omogući prekinuti programe eksterno putem HTTP-a. Za sve ostale slučajeve .Zatvoriti() savršeno će funkcionirati.

Kao i obično, cjeloviti kôd za ovaj članak dostupan je na projektu GitHub.


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