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
.
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
}
}