Programmatisk genstart af en Spring Boot-applikation

1. Oversigt

I denne vejledning viser vi, hvordan du gør det programmatisk genstart en Spring Boot-applikation.

At genstarte vores applikation kan være meget praktisk i nogle tilfælde:

  • Genindlæsning af konfigurationsfiler efter ændring af en eller anden parameter
  • Ændring af den aktuelt aktive profil ved kørsel
  • Geninitialisering af applikationskonteksten af ​​en eller anden grund

Mens denne artikel dækker funktionaliteten ved genstart af en Spring Boot-applikation, skal du bemærke, at vi også har en god tutorial om lukning af Spring Boot-applikationer.

Lad os nu undersøge forskellige måder, hvorpå vi kan implementere genstart af en Spring Boot-applikation.

2. Genstart ved at oprette en ny kontekst

Vi kan genstarte vores ansøgning ved at lukke applikationskonteksten og oprette en ny kontekst fra bunden. Selv om denne fremgangsmåde er ret enkel, er der nogle sarte detaljer, vi skal være forsigtige med for at få det til at fungere.

Lad os se, hvordan vi implementerer dette i vigtigste metode til vores Spring Boot-app:

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

Som vi kan se i ovenstående eksempel, er det vigtigt at genskabe konteksten i en separat ikke-dæmonstråd - på denne måde forhindrer vi JVM-nedlukning, udløst af tæt metode fra lukning af vores ansøgning. Ellers ville vores ansøgning stoppe, da JVM ikke venter på, at dæmontråde er færdige, før de afsluttes.

Lad os derudover tilføje et REST-slutpunkt, hvorigennem vi kan udløse genstart:

@RestController public class GenstartController {@PostMapping ("/ genstart") offentlig ugyldig genstart () {Application.restart (); }}

Her har vi tilføjet en controller med en kortlægningsmetode, der påberåber vores genstart metode.

Vi kan derefter ringe til vores nye slutpunkt for at genstarte applikationen:

curl -X POST localhost: port / genstart

Selvfølgelig, hvis vi tilføjer et slutpunkt som dette i en applikation i virkeligheden, bliver vi også nødt til at sikre det.

3. Aktuatorens genstart slutpunkt

En anden måde at genstarte vores applikation på er at bruge den indbyggede GenstartEndpoint fra Spring Boot Actuator.

Lad os først tilføje de krævede Maven-afhængigheder:

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

Dernæst skal vi aktivere det indbyggede genstart slutpunkt i vores application.properties fil:

management.endpoint.restart.enabled = sand

Nu hvor vi har oprettet alt, kan vi indsprøjte GenstartSlutpunkt i vores tjeneste:

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

I ovenstående kode bruger vi GenstartEndpoint bønne for at genstarte vores ansøgning. Dette er en god måde at genstarte på, fordi vi kun skal kalde en metode, der gør alt arbejdet.

Som vi kan se, ved hjælp af GenstartEndpoint er en enkel måde at genstarte vores applikation på. På den anden side er der en ulempe ved denne tilgang, fordi det kræver, at vi tilføjer de nævnte biblioteker. Hvis vi ikke allerede bruger dem, kan det være for meget overhead til kun denne funktionalitet. I så fald kan vi holde os til den manuelle tilgang fra det foregående afsnit, da det kun kræver et par flere linjer med kode.

4. Opdatering af applikationskonteksten

I nogle tilfælde kan vi genindlæse applikationskonteksten ved at kalde dens opdateringsmetode.

Selvom denne metode måske lyder lovende, understøtter kun nogle applikationskonteksttyper opdatering af en allerede initialiseret kontekst. For eksempel, FileSystemXmlApplicationContext, GroovyWebApplicationContext, og et par andre støtter det.

Desværre, hvis vi prøver dette i en Spring Boot-webapplikation, får vi følgende fejl:

java.lang.IllegalStateException: GenericApplicationContext understøtter ikke flere opdateringsforsøg: bare kald 'opdater' en gang

Endelig, selvom der er nogle sammenhængstyper, der understøtter flere opdateringer, bør vi undgå at gøre dette. Årsagen er, at Opdater metoden er designet som en intern metode, der bruges af rammen til at initialisere applikationskonteksten.

5. Konklusion

I denne artikel undersøgte vi en række forskellige måder, hvordan du genstarter en Spring Boot-applikation programmatisk.

Som altid kan vi finde kildekoden til eksemplerne på GitHub.


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