【发布时间】:2015-07-04 03:31:42
【问题描述】:
我们现在已经在几个项目中使用 Spring Boot,我们使用的是最新版本 1.2.3。我们正在合并执行器。到目前为止,一切都运行良好,除了我们发现 /health 指示器 [default] 显示服务已关闭。这不是真的。这些服务是用数据源实现的。它可能会调用其他 SOAP 或 Rest 服务。健康服务通过什么来衡量服务是否已关闭?
【问题讨论】:
标签: spring spring-boot
我们现在已经在几个项目中使用 Spring Boot,我们使用的是最新版本 1.2.3。我们正在合并执行器。到目前为止,一切都运行良好,除了我们发现 /health 指示器 [default] 显示服务已关闭。这不是真的。这些服务是用数据源实现的。它可能会调用其他 SOAP 或 Rest 服务。健康服务通过什么来衡量服务是否已关闭?
【问题讨论】:
标签: spring spring-boot
DataSourceHealthIndicator 用于检查可用性。默认查询是SELECT 1,但也有一些特定于产品的查询。
你可以写你自己的HealthIndicator。要么实现接口,要么扩展AbstractHealthIndicator。
要禁用默认的 db-health-check,请将此行放入您的应用程序属性 management.health.db.enabled=false。
希望有帮助
【讨论】:
正如#derFuerst 所说,DataSourceHealthIndicator 有默认查询来检查数据库是否启动。
如果您想使用正确的供应商特定查询,您应该在配置类中编写自己的健康指标,例如 Oracle 数据源:
@Autowired(required = false)
private DataSource dataSource;
@Bean
@Primary
public DataSourceHealthIndicator dataSourceHealthIndicator() {
return new DataSourceHealthIndicator(dataSource, "SELECT 1 FROM DUAL");
}
【讨论】:
以上评论帮助我开始了我的研究,但对我来说这还不够:
@Bean
@Primary
public DataSourceHealthIndicator dataSourceHealthIndicator() {
return new DataSourceHealthIndicator(dataSource, "SELECT 1 FROM DUAL");
}
这里是帮助我让它运行的配置:定义 HealthIndicator @Bean 如下所示并提供所需的查询:
@Bean
@Primary
public HealthIndicator dbHealthIndicator() {
return new DataSourceHealthIndicator(dataSource, "SELECT 1 FROM DUMMY");
}
如果没有提供查询,将使用 SELECT 1。正如#derFuerst所说,将使用,这是DataSourceHealthIndicator的默认实现:
public DataSourceHealthIndicator(DataSource dataSource, String query) {
super("DataSource health check failed");
this.dataSource = dataSource;
this.query = query;
this.jdbcTemplate = dataSource != null ? new JdbcTemplate(dataSource) : null;
}
...
protected String getValidationQuery(String product) {
String query = this.query;
if (!StringUtils.hasText(query)) {
DatabaseDriver specific = DatabaseDriver.fromProductName(product);
query = specific.getValidationQuery();
}
if (!StringUtils.hasText(query)) {
query = "SELECT 1";
}
return query;
}
【讨论】:
大家好,我是使用执行器进行健康检查的初学者。我使用了下面的解决方案,它奏效了,
@Autowired(required = false)
private DataSource dataSource;
@Bean
@Primary
public DataSourceHealthIndicator dataSourceHealthIndicator() {
return new DataSourceHealthIndicator(dataSource, "SELECT 1 FROM DUAL");
}
但是任何人都可以告诉我验证查询是如何工作的,即使没有名为 Dual 的表。同样根据我的理解,当我们请求“/actuator/health”时,会自动调用 HealthIndicator 的所有实现并执行健康检查方法。如果我错了,请纠正我
【讨论】: