¿Cómo puedo apagar programáticamente una aplicación Spring Boot sin terminar la VM ?
En otras obras, ¿qué es lo contrario de
new SpringApplication(Main.class).run(args);
java
spring
spring-boot
Axel Fontaine
fuente
fuente
Respuestas:
Cerrar un
SpringApplication
básicamente significa cerrar el subyacenteApplicationContext
. ElSpringApplication#run(String...)
método te da esoApplicationContext
como unConfigurableApplicationContext
. Entonces puedesclose()
hacerlo tú mismo.Por ejemplo,
Alternativamente, puede utilizar el
static
SpringApplication.exit(ApplicationContext, ExitCodeGenerator...)
método de ayuda para hacerlo por usted. Por ejemplo,fuente
ExitCodeGenerator
se puede usar. Puede volver delmain
método para salir con gracia (código de salida 0).En una aplicación de arranque de primavera, puede usar algo como esto
ShutdownManager.java
fuente
ApplicationContext
se puede inyectar automáticamente en otros granos.Esto funciona, incluso hecho está impreso.
Entonces agregando
.close()
despuésrun()
Explicación:
y:
Entonces, básicamente, no cerrará el contexto principal, por eso la VM no se cierra.
fuente
SpringApplication.exit(appContext, () -> returnCode)
.SpringApplication.run(MyApplication.class, args)
, entonces no hay un contexto principal. Solo hay un contexto, el contexto creado y devuelto porrun
, que luego inmediatamenteclose
. @Michael tiene razón. Esto no funcionará para los programas que necesitan hacer algo después de que se inicialice el contexto Spring, que es la mayoría de los programas.En la aplicación puedes usar
SpringApplication
. Tiene unexit()
método estático que toma dos argumentos: elApplicationContext
y unExitCodeGenerator
:es decir, puede declarar este método:
Dentro de las pruebas de Integración puede lograrlo agregando una
@DirtiesContext
anotación a nivel de clase:@DirtiesContext(classMode=ClassMode.AFTER_CLASS)
- El ApplicationContext asociado se marcará como sucio después de la clase de prueba.@DirtiesContext(classMode=ClassMode.AFTER_EACH_TEST_METHOD)
- El ApplicationContext asociado se marcará como sucio después de cada método de prueba en la clase.es decir
fuente
Esto asegurará que la aplicación SpringBoot se cierre correctamente y que los recursos se devuelvan al sistema operativo,
fuente