Vypnutie aplikácie Spring Boot

1. Prehľad

Správa životného cyklu aplikácie Spring Boot je pre systém pripravený na výrobu veľmi dôležitá. Nádoba Spring rieši vytváranie, inicializáciu a zničenie všetkých fazulí pomocou ApplicationContext.

Dôraz sa kladie na túto fázu ničenia životného cyklu. Konkrétnejšie sa pozrieme na rôzne spôsoby ukončenia aplikácie Spring Boot.

Ak sa chcete dozvedieť viac o tom, ako nastaviť projekt pomocou Spring Boot, prečítajte si článok Spring Boot Starter alebo si pozrite konfiguráciu Spring Boot.

2. Koncový bod vypnutia

V predvolenom nastavení sú všetky koncové body povolené v aplikácii Spring Boot okrem /vypnúť; toto je samozrejme súčasťou Aktuátor koncové body.

Tu je závislosť Maven, ktorá ich nastavuje:

 org.springframework.boot spring-boot-starter-aktuator 

A ak chceme nastaviť aj podporu zabezpečenia, potrebujeme:

 org.springframework.boot spring-boot-starter-security 

Nakoniec povolíme koncový bod vypnutia v application.properties spis:

management.endpoints.web.exposure.include = * management.endpoint.shutdown.enabled = skutočné endpoints.shutdown.enabled = true

Upozorňujeme, že musíme tiež zverejniť všetky koncové body aktuátora, ktoré chceme použiť. V príklade vyššie sme odhalili všetky koncové body aktuátora, ktoré budú zahŕňať /vypnúť koncový bod.

Na vypnutie aplikácie Spring Boot jednoducho zavoláme metódu POST, ako je táto:

curl -X POST localhost: port / aktuátor / vypnutie

V tejto výzve prístav predstavuje port ovládacieho prvku.

3. Zatvorte kontext aplikácie

Môžeme tiež zavolať Zavrieť() metóda priamo pomocou kontextu aplikácie.

Začnime príkladom vytvorenia kontextu a jeho uzavretia:

ConfigurableApplicationContext ctx = nový SpringApplicationBuilder (Application.class) .web (WebApplicationType.NONE) .run (); System.out.println ("Bola spustená aplikácia Spring Boot"); ctx.getBean (TerminateBean.class); ctx.close ();

To zničí všetky fazule, uvoľní zámky a potom zavrie továreň na fazule. Na overenie vypnutia aplikácie používame jarné štandardné spätné volanie životného cyklu s @PreDestroy anotácia:

verejná trieda TerminateBean {@PreDestroy public void onDestroy () vyvolá výnimku {System.out.println ("Jarný kontajner je zničený!"); }}

Musíme tiež pridať fazuľu tohto typu:

@Configuration public class ShutdownConfig {@Bean public TerminateBean getTerminateBean () {return new TerminateBean (); }}

Tu je výstup po spustení tohto príkladu:

Aplikácia Spring Boot sa začala zatvárať [chránené e-mailom] DefaultLifecycleProcessor - zastavenie fazule vo fáze 0 Zrušenie registrácie fazule vystavenej JMX pri vypnutí Nádoba na jar je zničená!

Je potrebné mať na pamäti dôležitú vec: pri zatváraní kontextu aplikácie nebude nadradený kontext ovplyvnený kvôli samostatným životným cyklom.

3.1. Zatvorte aktuálny kontext aplikácie

Vo vyššie uvedenom príklade sme vytvorili kontext podradenej aplikácie, potom sme použili znak Zavrieť() metóda na jeho zničenie.

Ak chceme uzavrieť súčasný kontext, jedným z riešení je jednoducho zavolať aktuátor /vypnúť koncový bod.

Môžeme si však vytvoriť aj vlastný koncový bod:

@RestController verejná trieda ShutdownController implementuje ApplicationContextAware {súkromný kontext ApplicationContext; @PostMapping ("/ shutdownContext") public void shutdownContext () {((ConfigurableApplicationContext) kontext) .close (); } @Override public void setApplicationContext (ApplicationContext ctx) hodí BeansException {this.context = ctx; }}

Tu sme pridali radič, ktorý implementuje ApplicationContextAware rozhranie a prepíše metódu setter na získanie aktuálneho kontextu aplikácie. Potom v metóde mapovania jednoducho nazývame Zavrieť() metóda.

Potom môžeme zavolať náš nový koncový bod na vypnutie aktuálneho kontextu:

curl -X POST localhost: port / shutdownContext

Samozrejme, ak pridáte takýto koncový bod do aplikácie v reálnom živote, budete ho tiež chcieť zabezpečiť.

4. Výstup SpringApplication

SpringApplication registre a vypnúť pripojte k JVM, aby ste sa ubezpečili, že aplikácia je správne ukončená.

Fazuľa môže vykonávať ExitCodeGenerator rozhranie na vrátenie konkrétneho kódu chyby:

ConfigurableApplicationContext ctx = nový SpringApplicationBuilder (Application.class) .web (WebApplicationType.NONE) .run (); int exitCode = SpringApplication.exit (ctx, new ExitCodeGenerator () {@Override public int getExitCode () {// vrátiť chybový kód return 0;}}); System.exit (exitCode);

Rovnaký kód s aplikáciou Java 8 lambdas:

SpringApplication.exit (ctx, () -> 0);

Po zavolaní na System.exit (exitCode), program sa končí návratovým kódom 0:

Proces bol ukončený s výstupným kódom 0

5. Zabite proces aplikácie

Nakoniec môžeme aplikáciu Spring Boot vypnúť aj mimo aplikácie pomocou skriptu bash. Náš prvý krok pre túto možnosť je nechať kontext aplikácie zapísať jeho PID do súboru:

Aplikácia SpringApplicationBuilder = nová SpringApplicationBuilder (Application.class) .web (WebApplicationType.NONE); app.build (). addListeners (nový ApplicationPidFileWriter ("./ bin / shutdown.pid")); app.run ();

Ďalej vytvorte a vypnutie.bat súbor s nasledujúcim obsahom:

zabiť $ (kat ./bin/shutdown.pid)

Poprava vypnutie.bat extrahuje ID procesu z vypnutie.pid súbor a používa súbor zabiť príkaz na ukončenie bootovacej aplikácie.

6. Záver

V tomto rýchlom zápise sme sa venovali niekoľkým jednoduchým metódam, ktoré možno použiť na vypnutie bežiacej aplikácie Spring Boot.

Je na vývojárovi, aby si vybral vhodný spôsob; všetky tieto metódy by sa mali používať zámerne a zámerne.

Napríklad, .východ() je preferované, keď potrebujeme preniesť chybový kód do iného prostredia, pre ďalšie akcie povedzte JVM. PoužitímAplikáciaPID dáva väčšiu flexibilitu, pretože môžeme tiež spustiť alebo reštartovať aplikáciu s použitím bash skriptu.

Nakoniec /vypnúťje tu, aby to umožnilo ukončiť aplikácie externe cez HTTP. Pre všetky ostatné prípady .Zavrieť() bude fungovať perfektne.

Úplný kód tohto článku je ako obvykle k dispozícii v rámci projektu GitHub.


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