Jak mogę programowo wyłączenie Wiosna Boot aplikacja bez kończące VM ?
W innych pracach, co jest przeciwieństwem
new SpringApplication(Main.class).run(args);
java
spring
spring-boot
Axel Fontaine
źródło
źródło
Odpowiedzi:
Zamknięcie
SpringApplication
zasadniczo oznacza zamknięcie instrumentu bazowegoApplicationContext
.SpringApplication#run(String...)
Metoda daje toApplicationContext
jakoConfigurableApplicationContext
. Możeszclose()
to samemu.Na przykład,
Alternatywnie możesz użyć
static
SpringApplication.exit(ApplicationContext, ExitCodeGenerator...)
metody pomocnika, aby zrobić to za siebie. Na przykład,źródło
ExitCodeGenerator
można użyć. Możesz po prostu powrócić zmain
metody, aby bezpiecznie zakończyć (kod zakończenia 0).W aplikacji do rozruchu wiosennego możesz użyć czegoś takiego
ShutdownManager.java
źródło
ApplicationContext
może być automatycznie wstrzykiwany do innych ziaren.To działa, nawet gotowe jest drukowane.
Więc dodając
.close()
porun()
Wyjaśnienie:
i:
Zasadniczo więc nie zamknie kontekstu nadrzędnego, dlatego maszyna wirtualna się nie kończy.
źródło
SpringApplication.exit(appContext, () -> returnCode)
.SpringApplication.run(MyApplication.class, args)
, nie ma kontekstu nadrzędnego. Jest tylko jeden kontekst, kontekst utworzony i zwrócony przezrun
, który następnie natychmiastclose
. @Michael ma rację. To nie zadziała w przypadku programów, które muszą cokolwiek robić po zainicjowaniu kontekstu Spring, czyli w przypadku większości programów.W aplikacji możesz użyć
SpringApplication
. Maexit()
metodę statyczną , która przyjmuje dwa argumenty: theApplicationContext
i anExitCodeGenerator
:czyli możesz zadeklarować tę metodę:
Wewnątrz testów integracyjnych możesz to osiągnąć, dodając
@DirtiesContext
adnotację na poziomie klasy:@DirtiesContext(classMode=ClassMode.AFTER_CLASS)
- Powiązany ApplicationContext zostanie oznaczony jako brudny po klasie testowej.@DirtiesContext(classMode=ClassMode.AFTER_EACH_TEST_METHOD)
- Powiązany ApplicationContext zostanie oznaczony jako brudny po każdej metodzie testowej w klasie.to znaczy
źródło
Dzięki temu aplikacja SpringBoot zostanie poprawnie zamknięta, a zasoby zostaną zwrócone do systemu operacyjnego,
źródło