spring-boot - 启动期间未调用自定义 HealthIndicator

标签 spring-boot spring-boot-actuator

我为我们的应用程序实现了一个自定义的HealthIndicator,它运行良好。

我注意到,当我通过 IDE 运行应用程序(使用 IntelliJ 和 Eclipse 进行测试)时,会在启动期间调用 HealthIndicator.health() 方法。

但是,当我使用 JAR 文件本身运行应用程序时,在应用程序启动期间不会调用 HealthIndicator.health() 方法。

当我将其作为 JAR 文件运行时,为什么在启动期间未调用 HealthIndicator.health() 方法,并且它的行为不应该与通过 IDE 运行它时类似吗?

最佳答案

这实际上并不是一个真正的错误,而是您的 IDE 引起的副作用。您应该知道,Actuator 端点不仅通过 HTTP 公开,还通过 JMX 公开。如果你看一下the documentation ,您还会看到默认情况下在 HTTP 和 JMX 上启用运行状况端点。

此外,大多数 IDE(包括 IntelliJ 和 Eclipse)在通过 IDE 本身运行应用程序时将启用 JMX 代理。这意味着当应用程序启动时,会建立 JMX 连接,这将依次触发自定义运行状况指示器。

您可以很容易地验证这一点,例如让我们假设以下健康指标:

@Bean
public HealthIndicator alwaysUpHealthIndicator() {
    return () -> {
        log.info("Indicator invoked");
        return Health.up().withDetail("Foo", "Bar").build();
    };
}

如果您更改 IntelliJ 运行配置并禁用启用 JMX 代理,您会注意到该消息不再出现在日志中。

Screenshot of IntelliJ configuration

同样,如果您禁用运行状况 JMX 端点,您还会注意到您不会在日志中收到其他消息:

management.endpoints.jmx.exposure.exclude=health

这意味着您不应依赖在应用程序启动期间执行的 HealthIndicator。如果您的代码需要在应用程序启动时执行,请考虑使用 ApplicationRunnerCommandLineRunner bean。例如:

@Bean
public ApplicationRunner applicationRunner() {
    return args -> log.info("This will be invoked on startup");
}

关于spring-boot - 启动期间未调用自定义 HealthIndicator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56748655/

相关文章:

java - 如何在 Spring Boot Actuator 中注册匿名 HealthIndicators

java - 不要为 Spring Boot Actuator/health 端点显示磁盘空间和数据库

java - 为什么我的应用程序中没有启用关闭端点?

java - 方法签名是什么意思?字符串 value() 默认 "";

java - hibernate只保存列表中的第一个对象

spring-boot - 在 Controller 中以文件形式访问 Spring Boot 资源

spring-boot - 如何通过 JMX 使用 Spring Boot 执行器

spring-boot -/actuator/logger 响应中的 'configuredLevel' 和 'effectiveLevel' 有什么区别

javascript - 如何在 spring boot 中将映射从本地存储传递到 Controller ?

java - 将数据从表单对象传输到实体以进行更新方法的更干净的方法是什么?