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.