A tavaszi rendszerindító alkalmazás programozott újraindítása

1. Áttekintés

Ebben az oktatóanyagban megmutatjuk, hogyan kell programszerűen indítsa újra a Spring Boot alkalmazást.

Alkalmazásunk újraindítása bizonyos esetekben nagyon hasznos lehet:

  • A konfigurációs fájlok újratöltése néhány paraméter megváltoztatása után
  • Az aktuálisan aktív profil megváltoztatása futás közben
  • Bármilyen okból újra inicializálja az alkalmazás környezetét

Noha ez a cikk a Spring Boot alkalmazás újraindításának funkcióit ismerteti, vegye figyelembe, hogy remek bemutatónk is van a Spring Boot alkalmazások leállításáról.

Most vizsgáljuk meg a Spring Boot alkalmazás újraindításának különböző módjait.

2. Indítsa újra az új kontextus létrehozásával

Az alkalmazást úgy tudjuk újraindítani, hogy bezárjuk az alkalmazás kontextusát, és a semmiből új kontextust hozunk létre. Bár ez a megközelítés meglehetősen egyszerű, vannak olyan kényes részletek, amelyekkel vigyáznunk kell, hogy működjön.

Nézzük meg, hogyan lehet ezt megvalósítani a fő- a tavaszi rendszerindító alkalmazásunk módszere:

@SpringBootApplication public class Application {private static ConfigurableApplicationContext context; public static void main (String [] args) {context = SpringApplication.run (Application.class, args); } public static void restart () {ApplicationArguments args = context.getBean (ApplicationArguments.class); Szálszál = új Szál (() -> {context.close (); context = SpringApplication.run (Application.class, args.getSourceArgs ());}); thread.setDaemon (hamis); szál.indítás (); }}

Amint a fenti példában láthatjuk, fontos a kontextus újrateremtése egy külön nem démon szálban - így megakadályozzuk a JVM leállítását, amelyet a Bezárás módszerrel, az alkalmazásunk bezárásától. Ellenkező esetben alkalmazásunk leállna, mivel a JVM nem várja meg a démonszálak befejezését, mielőtt leállítaná őket.

Adjunk hozzá egy REST végpontot, amelyen keresztül kiválthatjuk az újraindítást:

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

Itt felvettünk egy vezérlőt egy leképezési módszerrel, amely meghívja a mi újrakezd módszer.

Ezután felhívhatjuk az új végpontunkat az alkalmazás újraindításához:

curl -X POST localhost: port / újraindítás

Természetesen, ha hozzáadunk egy ilyen végpontot egy valós alkalmazáshoz, akkor azt is biztosítanunk kell.

3. A működtető újraindítási végpontja

Az alkalmazás újraindításának másik módja a beépített használat RestartEndpoint tól től Tavaszi csomagtartó működtető.

Először adjuk hozzá a szükséges Maven-függőségeket:

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

Ezután engedélyeznünk kell a beépített újraindítási végpontot a alkalmazás.tulajdonságok fájl:

management.endpoint.restart.enabled = true

Most, hogy mindent beállítottunk, beadhatjuk a ÚjrakezdVégpont szolgáltatásunkba:

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

A fenti kódban a RestartEndpoint bab az alkalmazás újraindításához. Ez egy jó mód az újraindításra, mert csak egy módszert kell meghívnunk, amely elvégzi az összes munkát.

Mint láthatjuk, a RestartEndpoint egy egyszerű módja az alkalmazás újraindításának. A másik oldalon van egy hátránya ennek a megközelítésnek, mert megköveteli, hogy hozzáadjuk az említett könyvtárakat. Ha még nem használjuk őket, akkor ez csak ennek a funkciónak lehet túl nagy költség. Ebben az esetben ragaszkodhatunk az előző szakasz kézi megközelítéséhez, mivel csak néhány kódsorra van szükség.

4. Az alkalmazás kontextusának frissítése

Bizonyos esetekben újratölthetjük az alkalmazáskörnyezetet a frissítési módszer meghívásával.

Bár ez a módszer ígéretesnek tűnhet, csak néhány alkalmazáskörnyezet-típus támogatja a már inicializált környezet frissítését. Például, FileSystemXmlApplicationContext, GroovyWebApplicationContext, és még néhányan támogatják.

Sajnos, ha ezt megpróbáljuk egy Spring Boot webalkalmazásban, akkor a következő hibát kapjuk:

java.lang.IllegalStateException: GenericApplicationContext nem támogatja a többszöri frissítési kísérletet: csak egyszer hívja meg a "frissítést"

Végül, bár vannak olyan kontextustípusok, amelyek támogatják a többszörös frissítést, kerülnünk kell ezt. Ennek oka, hogy a Frissítés A módszer a belső keretrendszer által használt belső módszer, amelyet az alkalmazás kontextusának inicializálására használnak.

5. Következtetés

Ebben a cikkben számos különböző módszert tártunk fel, hogyan lehet a Spring Boot alkalmazást programszerűen újraindítani.

Mint mindig, a példák forráskódját is megtalálhatjuk a GitHubon.