Programmatisch herstarten van een Spring Boot-applicatie

1. Overzicht

In deze tutorial laten we zien hoe programmatisch herstart een Spring Boot-applicatie.

Het herstarten van onze applicatie kan in sommige gevallen erg handig zijn:

  • Herladen van configuratiebestanden bij het wijzigen van een parameter
  • Het momenteel actieve profiel tijdens runtime wijzigen
  • Herinitialiseren van de toepassingscontext om welke reden dan ook

Hoewel dit artikel de functionaliteit van het herstarten van een Spring Boot-applicatie behandelt, moet u er rekening mee houden dat we ook een geweldige tutorial hebben over het afsluiten van Spring Boot-applicaties.

Laten we nu verschillende manieren onderzoeken waarop we de herstart van een Spring Boot-applicatie kunnen implementeren.

2. Start opnieuw door een nieuwe context te creëren

We kunnen onze applicatie herstarten door de applicatiecontext te sluiten en een geheel nieuwe context te creëren. Hoewel deze benadering vrij eenvoudig is, zijn er enkele delicate details waarmee we voorzichtig moeten zijn om het te laten werken.

Laten we eens kijken hoe we dit kunnen implementeren in het hoofd methode van onze Spring Boot-app:

@SpringBootApplication openbare klasse Toepassing {privé statisch ConfigurableApplicationContext-context; openbare statische leegte hoofd (String [] args) {context = SpringApplication.run (Application.class, args); } openbare statische ongeldige herstart () {ApplicationArguments args = context.getBean (ApplicationArguments.class); Thread thread = nieuwe Thread (() -> {context.close (); context = SpringApplication.run (Application.class, args.getSourceArgs ());}); thread.setDaemon (false); thread.start (); }}

Zoals we in het bovenstaande voorbeeld kunnen zien, is het belangrijk om de context opnieuw te creëren in een afzonderlijke niet-daemon-thread - op deze manier voorkomen we het afsluiten van JVM, geactiveerd door de dichtbij methode, vanaf het sluiten van onze applicatie. Anders zou onze applicatie stoppen omdat de JVM niet wacht tot daemon-threads zijn voltooid voordat ze worden beëindigd.

Laten we bovendien een REST-eindpunt toevoegen waarmee we de herstart kunnen activeren:

@RestController openbare klasse RestartController {@PostMapping ("/ restart") openbare ongeldige herstart () {Application.restart (); }}

Hier hebben we een controller toegevoegd met een mappingmethode die onze herstarten methode.

We kunnen dan ons nieuwe eindpunt aanroepen om de applicatie opnieuw te starten:

curl -X POST localhost: poort / herstart

Als we een dergelijk eindpunt aan een real-life applicatie toevoegen, moeten we dit natuurlijk ook beveiligen.

3. Actuator's herstarteindpunt

Een andere manier om onze applicatie opnieuw te starten, is door het ingebouwde Start Endpoint opnieuw op van Veerboot-actuator.

Laten we eerst de vereiste Maven-afhankelijkheden toevoegen:

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

Vervolgens moeten we het ingebouwde herstartpunt inschakelen in ons application.properties het dossier:

management.endpoint.restart.enabled = waar

Nu we alles hebben opgezet, kunnen we de HerstartenEindpunt in onze service:

@Service openbare klasse RestartService {@Autowired privé RestartEndpoint restartEndpoint; openbare ongeldige herstartApp () {restartEndpoint.restart (); }}

In de bovenstaande code gebruiken we de Start Endpoint opnieuw op bean om onze applicatie opnieuw te starten. Dit is een leuke manier om opnieuw op te starten, omdat we maar één methode hoeven aan te roepen die al het werk doet.

Zoals we kunnen zien, gebruik je de Start Endpoint opnieuw op is een eenvoudige manier om onze applicatie opnieuw te starten. Aan de andere kant is er een nadeel aan deze benadering, omdat we de genoemde bibliotheken moeten toevoegen. Als we ze nog niet gebruiken, kan dit te veel overhead kosten voor alleen deze functionaliteit. In dat geval kunnen we vasthouden aan de handmatige benadering uit de vorige sectie, aangezien hiervoor nog maar een paar regels code nodig zijn.

4. De toepassingscontext vernieuwen

In sommige gevallen kunnen we de toepassingscontext opnieuw laden door de vernieuwingsmethode aan te roepen.

Hoewel deze methode veelbelovend klinkt, ondersteunen slechts enkele typen toepassingscontext het vernieuwen van een reeds geïnitialiseerde context. Bijvoorbeeld, FileSystemXmlApplicationContext, GroovyWebApplicationContext, en een paar anderen ondersteunen het.

Als we dit proberen in een Spring Boot-webtoepassing, krijgen we helaas de volgende foutmelding:

java.lang.IllegalStateException: GenericApplicationContext ondersteunt niet meerdere pogingen om te vernieuwen: roep gewoon 'refresh' eenmaal aan

Ten slotte, hoewel er enkele contexttypen zijn die meerdere vernieuwingen ondersteunen, moeten we dit vermijden. De reden is dat de vernieuwen methode is ontworpen als een interne methode die door het raamwerk wordt gebruikt om de toepassingscontext te initialiseren.

5. Conclusie

In dit artikel hebben we een aantal verschillende manieren onderzocht om een ​​Spring Boot-toepassing programmatisch opnieuw te starten.

Zoals altijd kunnen we de broncode voor de voorbeelden vinden op GitHub.