Spring GuavaCacheManager CacheBuilder RemovalListener ClassCastException可能性

时间:2017-02-17 18:41:37

标签: java spring caching guava spring-cache

我一直在使用Spring GuavaCacheManager在我的应用程序中进行缓存。

Spring 4.3版,Guava版本20.0

我在spring配置文件中初始化guava缓存构建器并在缓存文件中使用可缓存的注释。

根据Guava CacheBuilder RemovalListener文档,

  

警告:调用此方法后,请勿继续使用此缓存   建造者参考;而是使用此方法返回的引用。在   运行时,这些指向同一个实例,但只返回   reference具有正确的泛型类型信息,以确保   类型安全。为获得最佳效果,请使用标准方法链接惯用法   在上面的类文档中说明,配置构建器   并在单个语句中构建缓存。没听从这个   通知可能导致缓存抛出ClassCastException   在未来的某个未定义点进行操作。

我在spring配置文件中使用了remove listener返回的引用,但是对于下面的代码,将来某个未定义点的缓存操作是否有可能抛出ClassCastException?

Spring配置文件

@configuration
@EnableCaching
public class SpringConfig {

@Bean
public CacheBuilder<Object, Object> cacheBuilder() {
    CacheBuilder<Object, Object> cacheBuilder = CacheBuilder.from("maximumSize=1000,expireAfterAccess=1d").removalListener(addRemovalListener());

    return cacheBuilder;
}

@Autowired
private CacheBuilder<Object, Object> cacheBuilder;

@Bean
public CacheManager cacheManager() {
    GuavaCacheManager cacheManager = new GuavaCacheManager();
    cacheManager.setCacheBuilder(cacheBuilder);
    cacheManager.setAllowNullValues(false);
    return cacheManager;
}

private RemovalListener<Object, Object> addRemovalListener() {
    return new RemovalListener<Object, Object>() {
        public void onRemoval(RemovalNotification<Object, Object> removal) {

            if(RemovalCause.EXPLICIT != removal.getCause()) {

                try {
                    String key = (String) removal.getKey();
                    String val = (String) removal.getValue();
                    ......
                    ......
                } catch (Exception e) {
                    logger.error("Cache RemovalListener Exception [{}]", e.getMessage(), e);
                }
            }
        }
    };
}

}

Spring缓存文件

@Service
public class SpringCache {

@Autowired
private CacheManager cacheManager;

@Cacheable(cacheManager="cacheManager", key="#p0", cacheNames="cacheKeysMap", sync=true)
public String getKeyFromCache(String key) {
    ......
    ......
    return value;
}

@CacheEvict(cacheManager="cacheManager", key="#p0", cacheNames="cacheKeysMap")
public void deleteFromCache(String key) {

}

}

0 个答案:

没有答案