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

时间:2018-10-03 09:40:32

标签: 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

1 个答案:

答案 0 :(得分:0)

这是一个古老的问题,但是当我用同样的问题搜索时出现了,所以以为我仍然会给出答案。

据我所知,无法注册多个错误处理程序,但是您可以根据缓存的类型来区分错误处理,如下所示:

@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,将它们注入到Spring注册的错误处理程序中,然后从那里进行委派,以正确地分离逻辑。