Slå av en fjærstartapplikasjon

1. Oversikt

Å administrere livssyklusen til Spring Boot Application er veldig viktig for et produksjonsklar system. Spring Container håndterer opprettelse, initialisering og ødeleggelse av alle bønner ved hjelp av ApplicationContext.

Betoningen av denne oppskriften er ødeleggelsesfasen i livssyklusen. Mer spesifikt vil vi se på forskjellige måter å slå av en Spring Boot-applikasjon.

Hvis du vil lære mer om hvordan du setter opp et prosjekt ved hjelp av Spring Boot, kan du sjekke artikkelen om Spring Boot Starter eller gå gjennom Spring Boot Configuration.

2. Avslutning sluttpunkt

Som standard er alle sluttpunktene aktivert i Spring Boot Application unntatt /skru av; dette er naturlig nok en del av Aktuator endepunkter.

Her er Maven-avhengigheten for å sette opp disse:

 org.springframework.boot spring-boot-starter-actuator 

Og hvis vi også vil sette opp sikkerhetsstøtte, trenger vi:

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

Til slutt aktiverer vi sluttpunktet for avslutning i application.properties fil:

management.endpoints.web.exposure.include = * management.endpoint.shutdown.enabled = true endpoints.shutdown.enabled = true

Merk at vi også må eksponere eventuelle aktuatorendepunkter vi vil bruke. I eksemplet ovenfor har vi eksponert alle aktuatorendepunktene som inkluderer /skru av endepunkt.

For å stenge Spring Boot-applikasjonen, kaller vi bare en POST-metode som denne:

curl -X POST localhost: port / aktuator / shutdown

I denne samtalen, havn representerer aktuatorporten.

3. Lukk applikasjonskontekst

Vi kan også kalle Lukk() metode direkte ved hjelp av applikasjonskonteksten.

La oss starte med et eksempel på å lage en kontekst og lukke den:

ConfigurableApplicationContext ctx = new SpringApplicationBuilder (Application.class) .web (WebApplicationType.NONE) .run (); System.out.println ("Spring Boot-applikasjonen startet"); ctx.getBean (TerminateBean.class); ctx.close ();

Dette ødelegger alle bønnene, frigjør låsene og lukker deretter bønnefabrikken. For å verifisere nedleggelsen av applikasjonen bruker vi vårens standard tilbakeringing av livssyklus med @PreDestroy kommentar:

offentlig klasse TerminateBean {@PreDestroy offentlig ugyldighet onDestroy () kaster Unntak {System.out.println ("Spring Container er ødelagt!"); }}

Vi må også legge til en bønne av denne typen:

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

Her er resultatet etter å ha kjørt dette eksemplet:

Spring Boot-applikasjonen startet Lukking [email protected] DefaultLifecycleProcessor - Stoppe bønner i fase 0 Avregistrering av JMX-eksponerte bønner ved avslutning Spring Container er ødelagt!

Det viktige her å huske på: mens du lukker applikasjonskonteksten, påvirkes ikke foreldrekonteksten på grunn av separate livssykluser.

3.1. Lukk gjeldende applikasjonskontekst

I eksemplet ovenfor opprettet vi en søknadssammenheng for barn, og brukte deretter Lukk() metode for å ødelegge den.

Hvis vi vil lukke den nåværende konteksten, er en løsning å bare ringe aktuatoren /skru av endepunkt.

Vi kan imidlertid også lage vårt eget tilpassede endepunkt:

@RestController offentlig klasse ShutdownController implementerer ApplicationContextAware {privat ApplicationContext-kontekst; @PostMapping ("/ shutdownContext") public void shutdownContext () {((ConfigurableApplicationContext) context) .close (); } @ Override public void setApplicationContext (ApplicationContext ctx) kaster BeansException {this.context = ctx; }}

Her har vi lagt til en kontroller som implementerer ApplicationContextAware grensesnitt og overstyrer settermetoden for å oppnå gjeldende applikasjonskontekst. Så, i en kartleggingsmetode, kaller vi bare Lukk() metode.

Vi kan da ringe det nye endepunktet vårt for å stenge den nåværende konteksten:

curl -X POST localhost: port / shutdownContext

Selvfølgelig, hvis du legger til et sluttpunkt som dette i en virkelig applikasjon, vil du også sikre det.

4. Avslutt SpringApplication

SpringApplication registrerer a skru av koble til JVM for å sikre at applikasjonen avsluttes riktig.

Bønner kan implementere ExitCodeGenerator grensesnitt for å returnere en spesifikk feilkode:

ConfigurableApplicationContext ctx = new SpringApplicationBuilder (Application.class) .web (WebApplicationType.NONE) .run (); int exitCode = SpringApplication.exit (ctx, ny ExitCodeGenerator () {@Override public int getExitCode () {// returner feilkoden retur 0;}}); System.exit (exitCode);

Den samme koden med applikasjonen av Java 8 lambdas:

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

Etter å ha ringt System.exit (exitCode), avsluttes programmet med en 0 returkode:

Prosessen avsluttet med utgangskode 0

5. Drep appprosessen

Til slutt kan vi også slå av en Spring Boot-applikasjon utenfor applikasjonen ved å bruke et bash-skript. Vårt første skritt for dette alternativet er å la applikasjonskonteksten skrive sin PID i en fil:

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

Deretter oppretter du en shutdown.bat fil med følgende innhold:

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

Utførelsen av shutdown.bat trekker ut prosess-ID fra shutdown.pid filen og bruker drepe kommandoen for å avslutte Boot-applikasjonen.

6. Konklusjon

I denne raske oppskriften har vi dekket noen få enkle metoder som kan brukes til å stenge en løpende Spring Boot Application.

Mens det er opp til utvikleren å velge en passende metode; alle disse metodene skal brukes av design og med vilje.

For eksempel, .exit() foretrekkes når vi trenger å sende en feilkode til et annet miljø, si JVM for ytterligere handlinger. Ved hjelp avapplikasjonPID gir mer fleksibilitet, ettersom vi også kan starte eller starte programmet på nytt med bruk av bash script.

Endelig, /skru aver her for å gjøre det mulig å avslutte applikasjonene eksternt via HTTP. For alle de andre sakene .Lukk() vil fungere perfekt.

Som vanlig er den komplette koden for denne artikkelen tilgjengelig på GitHub-prosjektet.


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