gpt4 book ai didi

java - 禁用并替换默认 DataSourceHealthIndicator

转载 作者:行者123 更新时间:2023-12-01 16:51:39 34 4
gpt4 key购买 nike

我目前正在使用使用 Spring Boot Actuator“健康”端点实现的健康监控框架。 Actuator基础设施支持创建自定义健康检查,还提供了许多内置的健康检查;其中之一是DataSourceHealthIndicator

DataSourceHealthIndicatororg.springframework.boot.actuate.health 的一部分包,目前被我们的健康框架用来检查数据源的健康状况。我需要使用我自己的稍微修改过的 DataSourceHealthIndicator 版本并禁用“默认值”。

我已尝试建议的解决方案 herehere ,没有运气。我可能做错了什么?

谢谢!

<小时/>

编辑:2016 年 8 月 18 日下午 3:38(美国东部时间)

我已将我的 bean 重命名为 dbHealthIndicator 并将以下内容添加到我的配置类中:

@Bean
public HealthIndicator dbHealthIndicator() {
return new dbHealthIndicator();
}

我现在遇到以下异常:

org.springframework.beans.factory.BeanCreationException:创建类路径资源 [udtContext.xml] 中定义的名为“dataAccessMapperFactory”的 bean 时出错

java.lang.RuntimeException:java.sql.SQLException:无法启动通用连接池:oracle.ucp.UniversalConnectionPoolException

<小时/>

编辑:2016 年 8 月 19 日上午 9:22(美国东部时间)

这可能有助于展示我正在尝试做的事情。目前,我的 /health 端点返回如下所示的内容:

dataSource: {
status: "UP",
database: "mySql",
hello: "hello"
}

我希望它返回类似这样的内容,其中“结果”旁边的整数是我的数据库中的存储过程返回的状态代码:

dataSource: {
status: "UP",
database: "mySql",
hello: "hello",
result: 0
}

这是 DataSourceHealthIndicator.java 中执行检查的方法:

private void doDataSourceHealthCheck(Health.Builder builder) throws Exception {
String product = getProduct();
builder.up().withDetail("database", product);
String validationQuery = getValidationQuery(product);
if (StringUtils.hasText(validationQuery)) {
try {
// Avoid calling getObject as it breaks MySQL on Java 7
List<Object> results = this.jdbcTemplate.query(validationQuery,
new SingleColumnRowMapper());
Object result = DataAccessUtils.requiredSingleResult(results);
builder.withDetail("hello", result);
}
catch (Exception ex) {
builder.down(ex);
}
}
}

我需要在 builder.withDetail("hello", result); 下向此方法添加八行代码,以执行对存储过程的调用。我不想“反编译”默认类,并且我无法覆盖此方法,因为它是私有(private)的。我想我可以在我自己的 bean 中复制 DataSourceHealthIndicator.java 代码,添加我的代码,然后重新连接 Spring 以使用此版本,但我不知道这是否可行。

最佳答案

通常我会查看该 HealthIndicator 的配置。在本例中,它是 HealthIndicatorAutoConfiguration.DataSourcesHealthIndicatorConfiguration 。正如第一个链接建议所述。您需要将自定义 bean 命名为 dbHealthIndicator,以便 @ConditionalOnMissingBean(name = "dbHealthIndicator") 不允许注册默认值。

提供一些启动日志或不适合您的内容的详细信息将有助于人们排除故障。

以下是我如何让它工作的示例:

@SpringBootApplication
public class StackoverflowWebmvcSandboxApplication {
@Bean
public HealthIndicator dbHealthIndicator() {
return new HealthIndicator() {

@Override
public Health health() {
return Health.status(Status.UP).withDetail("hello", "hi").build();
}
};
}

public static void main(String[] args) {
SpringApplication.run(StackoverflowWebmvcSandboxApplication.class, args);
}

@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
}
}

然后返回 /health 端点:

{
"status": "UP",
"db": {
"status": "UP",
"hello": "hi"
},
"diskSpace": {
"status": "UP",
"total": 127927316480,
"free": 17191956480,
"threshold": 10485760
}
}

关于java - 禁用并替换默认 DataSourceHealthIndicator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38980999/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com