Spring 不监视特定数据源以进行运行状况检查

Spring 不监视特定数据源以进行运行状况检查,spring,spring-boot,spring-boot-actuator,Spring,Spring Boot,Spring Boot Actuator,我想知道是否存在某种方法来禁用SpringBoot执行器对特定数据源的监视 场景: 一个微服务使用3个数据源,但出于某些业务原因,其中一个数据源不需要由Spring Boot Health Indicator监控 如何禁用对一个特定数据源的监视 非常感谢 Juan Antonio我认为您必须禁用默认数据源运行状况指示器,您可以使用此属性执行此操作: management.health.db.enabled=false 然后配置您自己的运行状况指标,这些指标只针对您感兴趣的数据源,可能类似于:

我想知道是否存在某种方法来禁用SpringBoot执行器对特定数据源的监视

场景: 一个微服务使用3个数据源,但出于某些业务原因,其中一个数据源不需要由Spring Boot Health Indicator监控

如何禁用对一个特定数据源的监视

非常感谢


Juan Antonio

我认为您必须禁用默认数据源运行状况指示器,您可以使用此属性执行此操作:

management.health.db.enabled=false
然后配置您自己的运行状况指标,这些指标只针对您感兴趣的数据源,可能类似于:

@Autowired
private DataSource dataSourceA;

@Autowired
private DataSource dataSourceB;

@Bean
public DataSourceHealthIndicator dataSourceHealthIndicatorA() {
    return new DataSourceHealthIndicator(dataSourceA);
}

@Bean
public DataSourceHealthIndicator dataSourceHealthIndicatorB() {
    return new DataSourceHealthIndicator(dataSourceB);
}
或者,通过扩展
AbstractHealthIndicator
并只向其中注入您感兴趣的
数据源,编写您自己的“多数据源健康指示器”。任何类型为
HealthIndicator
的Spring bean将自动注册到
health
执行器,因此您只需让Spring创建自定义
HealthIndicator
,它将由执行器显示


在后台,您可以看到Spring如何配置默认的数据源运行状况检入:
org.springframework.boot.actuate.autoconfigure.datasourcehealthIndicatorConfiguration

自Spring启动2以来,您可以通过覆盖
org.springframework.boot.actuate.autoconfigure.jdbcdatasourcehealthincatorautoconfiguration
从运行状况检查中筛选数据源。在下面的示例中,将筛选没有池名称的数据源

@Configuration
public class YourDataSourceHealthIndicatorAutoConfiguration extends DataSourceHealthIndicatorAutoConfiguration {

    public NonMigrationDataSourceHealthIndicatorAutoConfiguration(Map<String, DataSource> dataSources, ObjectProvider<DataSourcePoolMetadataProvider> metadataProviders) {
        // Filter out datasources without a pool name
        super(filterDataSources(dataSources), metadataProviders);
    }

    private static Map<String, DataSource> filterDataSources(Map<String, DataSource> dataSources) {
        return dataSources.entrySet().stream()
                .filter(dataSourceEntry -> {
                    if (dataSourceEntry.getValue() instanceof HikariDataSource) {
                        HikariDataSource hikariDataSource = (HikariDataSource) dataSourceEntry.getValue();
                        return hikariDataSource.getPoolName() != null;
                    } else {
                        return true;
                    }
                }).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
    }
}

@配置
公共类YourDataSourceHealthIndicatorAutoConfiguration扩展了DataSourceHealthIndicatorAutoConfiguration{
公共非迁移数据源HealthIndicatorautoConfiguration(映射数据源、对象提供程序元数据提供程序){
//筛选出没有池名称的数据源
超级(过滤数据源(数据源)、元数据提供者);
}
专用静态地图过滤器数据源(地图数据源){
返回dataSources.entrySet().stream()
.filter(数据源条目->{
if(dataSourceEntry.getValue()实例为HikariDataSource){
HikariDataSource HikariDataSource=(HikariDataSource)dataSourceEntry.getValue();
返回hikariDataSource.getPoolName()!=null;
}否则{
返回true;
}
}).collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));
}
}

Hi@glitch,非常感谢您的评论。你知道Spring Boot中的哪个类添加了关于数据源的所有bean吗?@jabrena回复:“Spring Boot中的哪个类添加了关于数据源的所有bean”。。。我认为这个类是开始
org.springframework.boot.actuate.autoconfigure.DataSourcesHealthIndicatorConfiguration
的好地方,因为它是由
org.springframework.boot.actuate.autoconfigure.DataSourcesHealthIndicatorConfiguration
构建的,它必须包含在Spring应用程序上下文。我意识到我们已经晚了几年,但我对java还是新手,无法找到org.springframework.boot.actuate.autoconfigure.jdbc.datasourcehealthincatorautoconfiguration;似乎它可能已在参与者中使用,但覆盖参与者并不排除数据源。有什么想法吗?