在我的项目中,我开始使用Spring Boot Actuator。我使用/shutdown
端点来优雅地停止嵌入式Tomcat(这很好用),但我还需要在关机期间做一些自定义逻辑。有什么办法,怎么办?
答案 0 :(得分:4)
我可以想到在关闭应用程序之前执行某些逻辑的两种方法:
Filter
,毕竟它是一个Web应用程序。@Before
建议invoke
方法
醇>
由于/shutdown
是一个Servlet端点,您可以在调用Filter
端点之前注册一个/shutdown
:
public class ShutdownFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain)
throws ServletException, IOException {
// Put your logic here
filterChain.doFilter(request, response);
}
}
也不要忘记注册:
@Bean
@ConditionalOnProperty(value = "endpoints.shutdown.enabled", havingValue = "true")
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(new ShutdownFilter());
registrationBean.setUrlPatterns(Collections.singleton("/shutdown"));
return registrationBean;
}
@Aspect
如果您向/shutdown
端点发送请求,假设已启用关闭端点且安全性未阻止请求,则将调用invoke
方法。您可以定义@Aspect
来拦截此方法调用并将逻辑放在那里:
@Aspect
@Component
public class ShutdownAspect {
@Before("execution(* org.springframework.boot.actuate.endpoint.ShutdownEndpoint.invoke())")
public void runBeforeShutdownHook() {
// Put your logic here
System.out.println("Going to shutdown...");
}
}
也不要忘记启用AspectJAutoProxy
:
@SpringBootApplication
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class Application { ... }
spring-aspects
依赖:
compile 'org.springframework:spring-aspects'
答案 1 :(得分:2)
调用它时,关闭端点会在应用程序上下文中调用close()
。这意味着可以使用在关闭处理期间运行某些自定义逻辑的所有常用机制。
例如,您可以将bean添加到实现DisposableBean
的应用程序上下文中,或者在通过Java配置声明bean时使用destroyMethod
@Bean
属性:
@Bean(destroyMethod="whateverYouWant")
public void Foo {
return new Foo();
}
答案 2 :(得分:0)
如果创建自定义的ShutdownEndpoint bean,则可以添加自定义逻辑。
@Component
public class CustomShutdownEndpoint extends ShutdownEndpoint {
@Override
public Map<String, Object> invoke() {
// Add your custom logic here
return super.invoke();
}
}
通过这种方式,您可以更改任何逻辑spring-boot-actuator端点。