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.