我为我们的应用程序实现了一个自定义的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 代理,您会注意到该消息不再出现在日志中。
同样,如果您禁用运行状况 JMX 端点,您还会注意到您不会在日志中收到其他消息:
management.endpoints.jmx.exposure.exclude=health
这意味着您不应依赖在应用程序启动期间执行的 HealthIndicator
。如果您的代码需要在应用程序启动时执行,请考虑使用 ApplicationRunner
或 CommandLineRunner
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/