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

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

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

最佳答案

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

  1. 注册一个Filter,毕竟是一个web应用。
  2. 拦截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/

相关文章:

mysql - 在 JBoss 7.1.1 中为 MySQL 集群创建 XA 数据源 : Connection Read Only Error

java - JDK 包含哪些脚本语言解释器?

java - 创建复杂的 JSON 对象并存储在 Arangodb 中

java - 正则表达式还是异常处理?

spring - 在spring boot中gradle build(war)时,可以将静态文件放在根目录中吗?

java - 从 Spring-Jersey 1.x 迁移到 2.x

spring-boot - MockMvc 不再使用 Spring Boot 2.2.0.RELEASE 处理 UTF-8 字符

java - 创建名称为 'restHandlerMapping' 的 bean 时出错,缺少路径映射。 bean 'repositoryController' 必须映射到非空路径

java - 多个时区的Spring @Scheduled任务

java - 引用所有 TextView