我的服务mocksConnector中有这个可缓存的方法。
@Cacheable(value = GET_PRODUCT_CACHE)
public ProductDetailMock getProduct(final String productId) {
...
}
如果我使用Redis缓存运行这段代码,那么一切都很好:
mocksConnector.getProduct(productId)
但是如果我阻止了Redis,那么就会抛出RedisConnectionFailureException (这很有道理)
假设数据是关键的,方法getProduct
应该总是返回一些内容。
有什么方法可以将缓存配置为自动运行方法getProduct
的主体而不是简单地失败??
请注意,我正在搜索一般配置(或者方法级别的配置,可能?)。我知道我可以手动配置缓存并使用try/catch块,如下所示:
try {
redisClient.get(key)
} catch (Exception e) {
// Do something else...
}
但我不想那么做。
发布于 2022-07-08 23:54:48
我通过使用不抛出任何异常的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缓存中使用服务。
https://stackoverflow.com/questions/72917783
复制相似问题