在我的项目中,我开始使用 Spring Boot Actuator。我使用 /shutdown
端点优雅地停止嵌入式 Tomcat(这很好用),但我还需要在关机期间执行一些自定义逻辑。有什么办法,怎么做?
最佳答案
我可以想到两种方法来关闭应用程序之前执行一些逻辑:
- 注册一个
Filter
,毕竟是一个web应用。 - 拦截
invoke
使用@Before
建议的方法
Servlet 过滤器
由于 /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'
关于java - Spring Boot Actuator - 如何向/关闭端点添加自定义逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39472568/