我的服务中有这个可缓存方法mocksConnector:
@Cacheable(value = GET_PRODUCT_CACHE)
public ProductDetailMock getProduct(final String productId) {
...
}
如果我使用 Redis 缓存运行此代码,则一切正常:
mocksConnector.getProduct(productId)
但是如果我停止 Redis,则会抛出 RedisConnectionFailureException(有道理)
假设数据很关键,并且方法 getProduct
应该始终返回一些内容。
是否有任何方法可以将缓存配置为自动运行 getProduct
方法的主体,而不是简单地失败?
请注意,我正在搜索通用配置(或者方法级别的配置,也许?)。我知道我可以手动配置缓存并使用 try/catch block ,例如:
try {
redisClient.get(key)
} catch (Exception e) {
// Do something else...
}
但我不想这样做。
最佳答案
我通过使用不抛出任何异常的 CustomCacheErrorHandler 覆盖缓存错误处理程序来解决这个问题。请参阅 How to handle redis exceptions by using Spring Cache? 中威尔士的回复
首先,创建一个类
import org.springframework.cache.Cache;
import org.springframework.cache.interceptor.CacheErrorHandler;
public class CustomCacheErrorHandler implements CacheErrorHandler {
@Override
public void handleCacheGetError(RuntimeException exception, Cache cache, Object key) {
// Do nothing or log error
}
@Override
public void handleCachePutError(RuntimeException exception, Cache cache, Object key, Object value) {
// Do nothing or log error
}
@Override
public void handleCacheEvictError(RuntimeException exception, Cache cache, Object key) {
// Do nothing or log error
}
@Override
public void handleCacheClearError(RuntimeException exception, Cache cache) {
// Do nothing or log error
}
}
然后从配置中覆盖CacheErrorHandler
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.CacheErrorHandler;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableCaching
public class CacheConfig extends CachingConfigurerSupport {
...
@Override
public CacheErrorHandler errorHandler() {
return new CustomCacheErrorHandler();
}
}
现在,即使缓存不可用,我们也可以使用带有 Redis 缓存的服务。
关于java - 当Redis缓存不可用时如何防止所有RedisConnectionFailureException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72917783/