代码之家  ›  专栏  ›  技术社区  ›  James Selvakumar

无法从缓存管理器获取缓存,除非cachemanager.getCacheNames()被调用

  •  0
  • James Selvakumar  · 技术社区  · 7 年前

    我的应用程序使用Spring 4.3.x、EhCache 3.6和javax Cache 1.1.0。 以下是我在应用程序中配置javax CacheManager的方法:

        <bean id="jCacheManager" class="org.springframework.cache.jcache.JCacheCacheManager">
            <property name="cacheManager" ref="appCacheManagerFactoryBean" />
        </bean>
    
        <bean id="appCacheManagerFactoryBean" class="com.example.AppCacheManagerFactoryBean"/>
    

    AppCacheManagerFactoryBean(它只是JCacheManagerFactoryBean的自定义版本)帮助我为我的应用配置全局持久性目录。下面是它的外观:

    public class AppCacheManagerFactoryBean implements FactoryBean<CacheManager>, InitializingBean,
        DisposableBean {
    
    @Value("${cache.persistenceDir}")
    private String persistenceDir;
    
    private CacheManager cacheManager;
    
    @Override
    public void afterPropertiesSet() {
        this.cacheManager = buildCacheManager();
    }
    
    private CacheManager buildCacheManager()
    {
        EhcacheCachingProvider cachingProvider = (EhcacheCachingProvider) Caching.getCachingProvider();
        DefaultConfiguration defaultConfiguration = new DefaultConfiguration(cachingProvider.getDefaultClassLoader(),
                new DefaultPersistenceConfiguration(new File(persistenceDir)));
        return cachingProvider.getCacheManager(cachingProvider.getDefaultURI(), defaultConfiguration);
    }
    
    
    @Override
    public CacheManager getObject() {
        return this.cacheManager;
    }
    
    @Override
    public Class<?> getObjectType() {
        return (this.cacheManager != null ? this.cacheManager.getClass() : CacheManager.class);
    }
    
    @Override
    public boolean isSingleton() {
        return true;
    }
    
    
    @Override
    public void destroy() {
        this.cacheManager.close();
    }
    }
    

    下面是我如何定义缓存的。我使用Ehcache API创建缓存,因为缓存所需的某些功能无法通过jcacheapi获得。

    EhcacheManager ehcacheManager = jCacheCacheManager.getCacheManager().unwrap(EhcacheManager.class);
    ehcacheManager.createCache("foo", CacheConfigurationBuilder.newCacheConfigurationBuilder(
                    String.class, Foo.class,
                    ResourcePoolsBuilder.newResourcePoolsBuilder()
                            .heap(1)
                            .offheap(1, MemoryUnit.GB)
                            .disk(5, MemoryUnit.GB)
            ));
    

    当我试图从应用程序中其他地方的缓存管理器检索缓存时,会引发空指针异常。

    Caching.getCachingProvider().getCacheManager().getCache("foo");
    

    但是,如果在CacheManager中调用getCacheNames()方法后检索缓存,则缓存将正常获取。

     Caching.getCachingProvider().getCacheManager().getCacheNames();
     Caching.getCachingProvider().getCacheManager().getCache("foo");
    

    1 回复  |  直到 7 年前
        1
  •  0
  •   Henri    7 年前

    我的第一个问题是:“为什么不使用SpringCache的内置支持?”不需要这么做。这个 JCacheCacheManager 会照顾好一切的。

    然后,您的问题是缓存直接在Ehcache中创建,而不经过JSR107层。打电话 getCacheNames()

    CacheManager cacheManager = jcacheCacheManager.getCacheManager();
    cacheManager.createCache("foo",
        Eh107Configuration.fromEhcacheCacheConfiguration(
            CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, Foo.class, ResourcePoolsBuilder.newResourcePoolsBuilder()
                        .heap(1)
                        .offheap(1, MemoryUnit.GB)
                        .disk(5, MemoryUnit.GB))
                .build()));
    
    推荐文章