最近是重新開發整個項目,在上線測試的時候發現這個問題。
項目環境:SpringBoot2.x+Consul+Redission+Maven
報錯的信息如下:
o.s.b.a.redis.RedisHealthIndicator - Redis health check failed
org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
項目中引用了健康檢查
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
通過spring-boot-actuator-autoconfigure:2.1.13.RELEASE的jar包找到了源碼
源代碼如下:
@Configuration
@ConditionalOnClass(RedisConnectionFactory.class)
@ConditionalOnBean(RedisConnectionFactory.class)
@ConditionalOnEnabledHealthIndicator("redis")
@AutoConfigureBefore(HealthIndicatorAutoConfiguration.class)
@AutoConfigureAfter({ RedisAutoConfiguration.class, RedisReactiveHealthIndicatorAutoConfiguration.class })
public class RedisHealthIndicatorAutoConfiguration
extends CompositeHealthIndicatorConfiguration<RedisHealthIndicator, RedisConnectionFactory> {
private final Map<String, RedisConnectionFactory> redisConnectionFactories;
public RedisHealthIndicatorAutoConfiguration(Map<String, RedisConnectionFactory> redisConnectionFactories) {
this.redisConnectionFactories = redisConnectionFactories;
}
@Bean
@ConditionalOnMissingBean(name = "redisHealthIndicator")
public HealthIndicator redisHealthIndicator() {
return createHealthIndicator(this.redisConnectionFactories);
}
}
解決方法1:
通過@ConditionalOnEnabledHealthIndicator可以知道解決辦法,在配置文件中禁用redis檢查
management:
health:
redis: ---禁用redis檢查
# defaults: ---也可以禁用,不推薦
enabled: false
解決方法2:
查看源碼發現RedisHealthIndicator繼承AbstractHealthIndicator,AbstractHealthIndicator實現了HealthIndicator接口。我們可以通過自定義配置來解決。
@Configuration
public class RedisHealthIndicator implements HealthIndicator{
@Override
public Health health() {
return Health.up().build();
}
}
注意:我們必須要將原有的RedisHealthIndicator類覆蓋,所以class名為RedisHealthIndicator。如果類想另起名則需指定bean名為redisHealthIndicator,否則還是會出現錯誤信息。
最后說下自己遇到的原因吧!屬實有點尷尬。
自己項目上線遇到的問題則是怪自己粗心。只在redisson的配置文件中配置了redis連接,忘記在application.yml配置redis的連接信息。