最近redis 域名一致解析錯誤,導致業務多了很多異常。那么如何在這種情況下直接訪問數據庫,而不是報錯呢
1. 解決方案
其實很簡單,在配置 redis 時,只需要多一項配置,繼承 CachingConfigurerSupport ,然后重寫其 errorHandler 方法即可,代碼如下:
/**
* 如果cache出錯, 我們會記錄在日志里,方便排查,比如反序列化異常
*/
@Override
public CacheErrorHandler errorHandler() {
return new LoggingCacheErrorHandler();
}
static class LoggingCacheErrorHandler extends SimpleCacheErrorHandler {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public void handleCacheGetError(RuntimeException exception, Cache cache, Object key) {
logger.error(String.format("cacheName:%s,cacheKey:%s", cache == null ? "unknown" : cache.getName(), key), exception);
// super.handleCacheGetError(exception, cache, key); 不拋出錯誤,記錄日志
}
@Override
public void handleCachePutError(RuntimeException exception, Cache cache, Object key, Object value) {
logger.error(String.format("cacheName:%s,cacheKey:%s", cache == null ? "unknown" : cache.getName(), key), exception);
// super.handleCachePutError(exception, cache, key, value);不拋出錯誤,記錄日志
}
@Override
public void handleCacheEvictError(RuntimeException exception, Cache cache, Object key) {
logger.error(String.format("cacheName:%s,cacheKey:%s", cache == null ? "unknown" : cache.getName(), key), exception);
// super.handleCacheEvictError(exception, cache, key);不拋出錯誤,記錄日志
}
@Override
public void handleCacheClearError(RuntimeException exception, Cache cache) {
logger.error(String.format("cacheName:%s", cache == null ? "unknown" : cache.getName()), exception);
// super.handleCacheClearError(exception, cache);不拋出錯誤,記錄日志
}
}
只要處理時不拋出錯誤,就會繼續走下去,然后調用原方法體內。
注意:錯誤僅僅打日志會讓我們忽略,而異常我們是可以看得到的。所以,這種錯誤還是需要被感知,也就是需要給開發者發郵件通知,然后針對去處理