首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >不监视特定数据源进行健康检查

不监视特定数据源进行健康检查
EN

Stack Overflow用户
提问于 2017-10-14 08:27:13
回答 4查看 19.3K关注 0票数 14

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

场景: One Microservice使用3条数据资源,但由于某些业务原因,其中一条数据资源不需要由监视。

如何禁用对特定DataSource的监视?

事先非常感谢

胡安·安东尼奥

EN

回答 4

Stack Overflow用户

发布于 2017-10-14 09:01:09

我认为您必须禁用默认的数据源健康指示符,使用此属性可以这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
management.health.db.enabled=false

然后配置您自己的健康指标,它只针对您感兴趣的数据源,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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并只向其注入您感兴趣的Datasources来编写您自己的“多个数据源健康指示器”。任何HealthIndicator类型的Spring都将自动注册到health执行器中,所以您只需要让Spring创建您的自定义HealthIndicator,它就会被执行器公开。

对于背景,您可以看到Spring如何配置默认数据源健康状况签入:org.springframework.boot.actuate.autoconfigure.DataSourcesHealthIndicatorConfiguration

票数 28
EN

Stack Overflow用户

发布于 2019-04-11 06:25:20

从Spring 2开始,您可以通过重写org.springframework.boot.actuate.autoconfigure.jdbcDataSourceHealthIndicatorAutoConfiguration从健康检查中筛选数据源。在下面的示例中,对没有池名的数据源进行筛选。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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));
    }
}
票数 2
EN

Stack Overflow用户

发布于 2021-11-19 05:03:30

我认为最简单的方法是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
        public class DatasourceHealthCheckConfig  extends DataSourceHealthContributorAutoConfiguration {
    
    
        public DatasourceHealthCheckConfig(Map<String, DataSource> dataSources, ObjectProvider<DataSourcePoolMetadataProvider> metadataProviders) {
            super(dataSources, metadataProviders);
        }
    
        @Override
        public HealthContributor dbHealthContributor(Map<String, DataSource> dataSources) {
            // remove the required datasource from the dataSources map by its name
            
            return super.dbHealthContributor(dataSources);
        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46746784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文