我在Spring应用程序中启用了缓存,我使用Redis来实现此目的。 但是,每当发生连接失败时,应用程序都会停止工作,而我认为它更好 跳过缓存并继续执行正常的执行流程。
那么,有没有人知道如何在Spring中优雅地做到这一点?
这是我得到的例外。
Caused by: 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
答案 0 :(得分:6)
从Spring Framework 4.1开始,您可以实现CacheErrorHandler
来处理此类异常。有关详细信息,请参阅to the javadoc。
您可以通过@Configuration
类扩展CachingConfigurerSupport
来注册它(请参阅errorHandler()
)。
答案 1 :(得分:1)
Stephane Nicoll建议的CacheErrorHandler非常有用。但是当它无法创建与redis的连接时,它没有任何帮助。
像@Cacheable静态的缓存方法因RedisConnectionFailureException而失败。
答案 2 :(得分:1)
您可以按照 Stephane Nicoll 的建议使用 CacheErrorHandler
。但你应该确保
RedisCacheManager transactionAware
到 false
在您的 Redis 缓存配置中(以确保在执行缓存部分时尽早提交事务并且错误被 CacheErrorHandler
捕获并且不要等到结束跳过 CacheErrorHandler
部分的执行)。将 transactionAware
设置为 false
的函数如下所示:
@Bean
public RedisCacheManager redisCacheManager(LettuceConnectionFactory lettuceConnectionFactory) {
JdkSerializationRedisSerializer redisSerializer = new JdkSerializationRedisSerializer(getClass().getClassLoader());
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofHours(redisDataTTL))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer));
redisCacheConfiguration.usePrefix();
RedisCacheManager redisCacheManager = RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(lettuceConnectionFactory)
.cacheDefaults(redisCacheConfiguration)
.build();
redisCacheManager.setTransactionAware(false);
return redisCacheManager;
}
答案 3 :(得分:0)
与Stephane提到的类似,我通过在try catch块中消耗错误来完成。添加一个后退机制,如果Redis没有启动或可能是数据不存在,那么我从数据库中获取数据。(如果我找到一个,那么我在Redis中添加相同的数据,如果它是为了保持一致性。 )
答案 4 :(得分:0)
我一直在寻找相同的东西,使用Spring启动,这个here为我工作。