没有弃用的 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);
}
我尝试将 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);
}