Spring Boot Actuator - 如何向/ shutdown端点添加自定义逻辑

时间:2016-09-13 14:30:27

标签: java spring spring-boot spring-boot-actuator

在我的项目中,我开始使用Spring Boot Actuator。我使用/shutdown端点来优雅地停止嵌入式Tomcat(这很好用),但我还需要在关机期间做一些自定义逻辑。有什么办法,怎么办?

3 个答案:

答案 0 :(得分:4)

我可以想到在关闭应用程序之前执行某些逻辑的两种方法:

  1. 注册Filter,毕竟它是一个Web应用程序。
  2. 使用@Before建议
  3. 拦截invoke方法

    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'
    

答案 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端点。