tutorial starter mvc espaƱol java spring-boot

starter - spring java



Gancho de cierre de arranque de primavera (3)

¿Cómo puedo registrar / agregar una rutina de apagado personalizada que se activará cuando se cierre mi aplicación Spring Boot?

Escenario: Despliegue mi aplicación Spring Boot en un contenedor de servlet de Jetty (es decir, sin embarcadero incrustado). Mi aplicación usa Logback para el registro, y quiero cambiar los niveles de registro durante el tiempo de ejecución usando el configurador MBean JMX de Logback. Su documentación indica que para evitar fugas de memoria, al apagar se debe invocar un método específico de cierre de LoggerContext .

¿Cuáles son buenas formas de escuchar sobre los eventos de cierre de Spring Boot?

Yo he tratado:

public static void main(String[] args) throws Exception { ConfigurableApplicationContext cac = SpringApplication.run(Example.class, args); cac.addApplicationListener(new ApplicationListener<ContextClosedEvent>() { @Override public void onApplicationEvent(ContextClosedEvent event) { logger.info("Do something"); } }); }

pero este oyente registrado no se llama cuando la aplicación se apaga.


Su oyente está registrado demasiado tarde (esa línea nunca se alcanzará hasta que el contexto ya se haya cerrado). Debería ser suficiente para que sea @Bean .


http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-application-exit

Cada SpringApplication registrará un enlace de cierre con la JVM para garantizar que ApplicationContext se cierre correctamente al salir. Se pueden usar todas las devoluciones de llamada estándar del ciclo de vida de Spring (como la interfaz DesechableBean o la anotación @PreDestroy).

Además, los beans pueden implementar la interfaz org.springframework.boot.ExitCodeGenerator si desean devolver un código de salida específico cuando finaliza la aplicación.


import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; import org.springframework.boot.web.support.SpringBootServletInitializer; import org.springframework.context.annotation.Bean; @SpringBootApplication @EnableAutoConfiguration public class Application extends SpringBootServletInitializer { public static void main( String[] args) { SpringApplication.run(Application.class, args); } @NotNull @Bean ServletListenerRegistrationBean<ServletContextListener> myServletListener() { ServletListenerRegistrationBean<ServletContextListener> srb = new ServletListenerRegistrationBean<>(); srb.setListener(new ExampleServletContextListener()); return srb; } } import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class ExampleServletContextListener implements ServletContextListener { @Override public void contextInitialized( ServletContextEvent sce) { // Context Initialised } @Override public void contextDestroyed( ServletContextEvent sce) { // Here - what you want to do that context shutdown }

}