¿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
SpringApplicationbásicamente significa cerrar el subyacenteApplicationContext. ElSpringApplication#run(String...)método te da esoApplicationContextcomo unConfigurableApplicationContext. Entonces puedesclose()hacerlo tú mismo.Por ejemplo,
Alternativamente, puede utilizar el
staticSpringApplication.exit(ApplicationContext, ExitCodeGenerator...)método de ayuda para hacerlo por usted. Por ejemplo,fuente
ExitCodeGeneratorse puede usar. Puede volver delmainmé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
ApplicationContextse 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: elApplicationContexty unExitCodeGenerator:es decir, puede declarar este método:
Dentro de las pruebas de Integración puede lograrlo agregando una
@DirtiesContextanotació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