Start en Spring Boot-applikasjon på nytt

1. Oversikt

I denne opplæringen viser vi hvordan du gjør det programmatisk start et Spring Boot-program på nytt.

Å starte søknaden på nytt kan være veldig nyttig i noen tilfeller:

  • Last inn konfigurasjonsfiler på nytt når du endrer en parameter
  • Endrer den nåværende aktive profilen ved kjøretid
  • Initialisere søknadskonteksten på nytt av en eller annen grunn

Mens denne artikkelen dekker funksjonaliteten til å starte en Spring Boot-applikasjon, vær oppmerksom på at vi også har en flott veiledning om å stenge Spring Boot-applikasjoner.

La oss nå utforske forskjellige måter vi kan implementere omstart av en Spring Boot-applikasjon.

2. Start på nytt ved å opprette en ny kontekst

Vi kan starte applikasjonen på nytt ved å lukke applikasjonskonteksten og opprette en ny kontekst fra bunnen av. Selv om denne tilnærmingen er ganske enkel, er det noen delikate detaljer vi må være forsiktige med for å få det til å fungere.

La oss se hvordan vi kan implementere dette i hoved- metoden for vår Spring Boot-app:

@SpringBootApplication public class Application {private static ConfigurableApplicationContext context; public static void main (String [] args) {context = SpringApplication.run (Application.class, args); } offentlig statisk ugyldig omstart () {ApplicationArguments args = context.getBean (ApplicationArguments.class); Trådtråd = ny tråd (() -> {context.close (); context = SpringApplication.run (Application.class, args.getSourceArgs ());}); thread.setDaemon (false); thread.start (); }}

Som vi kan se i eksemplet ovenfor, er det viktig å gjenskape konteksten i en egen ikke-demon-tråd - på denne måten forhindrer vi JVM-nedleggelse, utløst av Lukk metode, fra å stenge søknaden vår. Ellers vil søknaden vår stoppe siden JVM ikke venter på at daemon-tråder skal fullføres før de avsluttes.

I tillegg, la oss legge til et REST-endepunkt som vi kan utløse omstart:

@RestController public class RestartController {@PostMapping ("/ restart") public void restart () {Application.restart (); }}

Her har vi lagt til en kontroller med en kartleggingsmetode som påkaller vår omstart metode.

Vi kan da ringe det nye endepunktet vårt for å starte applikasjonen på nytt:

curl -X POST localhost: port / start på nytt

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

3. Aktuatorens startpunkt på nytt

En annen måte å starte applikasjonen på nytt er å bruke den innebygde Start Endepunkt på nytt fra Spring Boot Actuator.

La oss først legge til de nødvendige Maven-avhengighetene:

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

Deretter må vi aktivere det innebygde omstartendepunktet i vårt application.properties fil:

management.endpoint.restart.enabled = true

Nå som vi har satt opp alt, kan vi injisere OmstartEndepunkt inn i vår tjeneste:

@Service public class RestartService {@Autowired private RestartEndpoint restartEndpoint; public void restartApp () {restartEndpoint.restart (); }}

I koden ovenfor bruker vi Start Endepunkt på nytt bønne for å starte søknaden på nytt. Dette er en fin måte å starte på nytt fordi vi bare trenger å ringe en metode som gjør alt arbeidet.

Som vi kan se, bruker du Start Endepunkt på nytt er en enkel måte å starte søknaden på nytt. På den andre siden er det en ulempe med denne tilnærmingen fordi det krever at vi legger til de nevnte bibliotekene. Hvis vi ikke bruker dem allerede, kan dette være for mye overhead for bare denne funksjonaliteten. I så fall kan vi holde oss til den manuelle tilnærmingen fra forrige avsnitt, siden det bare krever noen få linjer med kode.

4. Oppdatering av applikasjonskonteksten

I noen tilfeller kan vi laste applikasjonskonteksten på nytt ved å kalle oppdateringsmetoden.

Selv om denne metoden kan høres lovende ut, støtter bare noen applikasjonskonteksttyper oppdatering av en allerede initialisert kontekst. For eksempel, FileSystemXmlApplicationContext, GroovyWebApplicationContext, og noen få andre støtter det.

Dessverre, hvis vi prøver dette i en Spring Boot-webapplikasjon, får vi følgende feil:

java.lang.IllegalStateException: GenericApplicationContext støtter ikke flere oppdateringsforsøk: bare ring 'oppdater' en gang

Til slutt, selv om det er noen sammenhengstyper som støtter flere oppdateringer, bør vi unngå å gjøre dette. Årsaken er at forfriske metoden er designet som en intern metode som brukes av rammeverket for å initialisere applikasjonskonteksten.

5. Konklusjon

I denne artikkelen undersøkte vi en rekke forskjellige måter hvordan du starter en Spring Boot-applikasjon på nytt programmatisk.

Som alltid kan vi finne kildekoden for eksemplene på GitHub.


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