没有弃用的 CompositeHealthIndicator 的 SolrHealthIndicator

SolrHealthIndicator without deprecated CompositeHealthIndicator

我尝试将 Spring Boot 升级到 2.2.4.RELEASE 版本。 Everzthing if fine exept problem with CompositeHealthIndicator which is deprecated.

我有这个bean方法

@Autowired
private HealthAggregator healthAggregator;

    @Bean
public HealthIndicator solrHealthIndicator() {
    CompositeHealthIndicator composite = new CompositeHealthIndicator(
            this.healthAggregator);
    composite.addHealthIndicator("solr1", createHealthIndicator(firstHttpSolrClient()));
    composite.addHealthIndicator("solr2", createHealthIndicator(secondHttpSolrClient()));
    composite.addHealthIndicator("querySolr", createHealthIndicator(queryHttpSolrClient()));
    return composite;
}

private CustomSolrHealthIndicator createHealthIndicator(SolrClient source) {

    try {
        return new CustomSolrHealthIndicator(source);
    } catch (Exception ex) {
        throw new IllegalStateException("Unable to create helthCheckIndicator for solr client instance.", ex);
    }
}

为 3 个 SOLR 实例注册 HealthIndicator(2 个索引,1 个用于查询)。一切正常,直到 Spring 引导更新。更新后方法 CompositeHealthIndicator.addHealthIndicator 不存在,整个 class 被标记为已弃用。

createHealthIndicator中创建的class是这样的:

    public class CustomSolrHealthIndicator extends SolrHealthIndicator {

    private final SolrClient solrClient;

    public CustomSolrHealthIndicator(SolrClient solrClient) {
        super(solrClient);
        this.solrClient = solrClient;
    }

    @Override
    protected void doHealthCheck(Health.Builder builder) throws Exception {

        if (!this.solrClient.getClass().isAssignableFrom(HttpSolrClient.class)) {

            super.doHealthCheck(builder);
        }

        HttpSolrClient httpSolrClient = (HttpSolrClient) this.solrClient;
        if (StringUtils.isBlank(httpSolrClient.getBaseURL())) {
            return;
        }

        super.doHealthCheck(builder);
    }
}

有什么简单的方法可以改变注册 SOLR 实例的旧方法吗?我想检查它们在 Spring 引导版本 2 上是启动还是关闭。2.X?

编辑: 我试过这个:

@Bean
public CompositeHealthContributor solrHealthIndicator() {

    Map<String, HealthIndicator> solrIndicators = Maps.newLinkedHashMap();
    solrIndicators.put("solr1", createHealthIndicator(firstHttpSolrClient()));
    solrIndicators.put("solr2", createHealthIndicator(secondHttpSolrClient()));
    solrIndicators.put("querySolr", createHealthIndicator(queryHttpSolrClient()));

    return CompositeHealthContributor.fromMap(solrIndicators);
}

private CustomSolrHealthIndicator createHealthIndicator(SolrClient source) {

    try {
        return new CustomSolrHealthIndicator(source);
    } catch (Exception ex) {
        throw new IllegalStateException("Unable to create healthCheckIndicator for solr client instance.", ex);
    }
}

CustomSolrHealthIndicator 相对于启动状态没有变化。

但是我无法创建那个 bean。调用 createHealthIndicator 时出现 NoClassDefFoundError

有人知道问题出在哪里吗?

看来您可以使用 CompositeHealthContributor。它与您已经拥有的没有太大区别。看起来像这样的东西会起作用。如果您愿意,您也可以覆盖功能以一次添加一个,如果您有大量配置,这可能更可取。这两种方法都不应该有任何危害。

@Bean
public HealthIndicator solrHealthIndicator() {
    Map<String, HealthIndicator> solrIndicators;
    solrIndicators.put("solr1", createHealthIndicator(firstHttpSolrClient()));
    solrIndicators.put("solr2", createHealthIndicator(secondHttpSolrClient()));
    solrIndicators.put("querySolr", createHealthIndicator(queryHttpSolrClient()));
    return CompositeHealthContributor.fromMap(solrIndicators);
}

而不是弃用的 CompositeHealthIndicator#addHealthIndicator 使用带有映射的构造函数:

@Bean
public HealthIndicator solrHealthIndicator() {

    Map<String, HealthIndicator> healthIndicators = new HashMap<>();
    healthIndicators.put("solr1", createHealthIndicator(firstHttpSolrClient()));
    healthIndicators.put("solr2", createHealthIndicator(secondHttpSolrClient()));
    healthIndicators.put("querySolr", createHealthIndicator(queryHttpSolrClient()));

    return new CompositeHealthIndicator(this.healthAggregator, healthIndicators);
}