spring - 如何为多个CacheManager创建多个CacheErrorHandler?

标签 spring spring-boot redis ehcache

我正在开发一个配置为使用 2 个缓存管理器 EhCache 和 RedisCache 的 SpringBoot 微服务,并且我正在尝试实现 CacheErrorHandler 来分别处理缓存错误。

根据reference ,似乎我只能定义一个处理所有类型缓存的 CacheErrorHandler 。

我可以知道有没有办法为不同的缓存管理器实现不同的 CacheErrorHandler ?

Redis 缓存管理器 Bean 配置:

@Bean
@Primary
@ConditionalOnBean(CustomCacheProperties.class)
public CacheManager redisCacheManager(RedisConnectionFactory connectionFactory, CustomCacheProperties customCacheProperties) {
    return RedisCacheManager.builder(connectionFactory)
            .cacheDefaults(RedisCacheConfiguration.defaultCacheConfig())
            .withInitialCacheConfigurations(customCacheProperties.getInitialCacheConfigurations())
            .build();
}

EhCache 缓存管理器 Bean 配置:
@Bean(name = "ehcache")
public CacheManager ehcacheManager() {
    return new EhCacheCacheManager(ehCacheCacheManager().getObject());
}

引用:https://dzone.com/articles/safeguard-spring-app-from-cache-failure

最佳答案

这是一个老问题,但是当我用谷歌搜索同样的问题时,它就出现了,所以我想无论如何我都会给出答案。
据我所知,没有办法注册多个错误处理程序,但您可以根据缓存的类型区分错误处理,如下所示:

@Override
public void handleCacheGetError(RuntimeException exception, Cache cache, Object key) {
    if (cache instanceof Ehcache) {
        // ... handle EhCache failure
    } else if (cache instanceof RedisCache) {
        // ... handle Redis failure
    } else {
        // ... fallback
    }
}
您需要检查您使用的缓存管理器,了解它们创建的缓存的实际类型。
您还可以创建实现 CacheErrorHandler 的适当 bean,将它们注入(inject)到 Spring 注册的错误处理程序中,然后从那里委托(delegate),以正确分离逻辑。

关于spring - 如何为多个CacheManager创建多个CacheErrorHandler?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52624123/

相关文章:

java - redis 好像服务器关闭了连接

c# - 为什么 Redis C# 客户端方法 .getById() 返回 null?

ruby - 我可以序列化 ruby​​ Digest::SHA1 实例对象吗?

java - 无法在 Oracle 数据源连接中将自动提交值设置为 false

java - 具有不同实体错误的 JPA 托管映射

spring-boot - Spring Cloud Gateway 将 bean 传递给自定义过滤器

java - 忽略特定表的 Multi-Tenancy

java - 通过 Spring by Environment 注入(inject)属性值

Spring:在自定义 ViewResolver 中访问 HttpServletRequest

java - java.time 的 Spring DateTimeFormat 配置