EhCache WebCache 與 SpringMVC集成時 CacheManager沖突的問題


EhCache WebCache 與 SpringMVC集成時 CacheManager沖突的問題

在使用EhCache Web組件時 需要將 SimplePageCachingFilter 需要用到的CacheManager。

在EhCache2.5版本以上 同一個JVM當中不允許出現倆個相同名字的CacheManager 否則會報錯。

默認情況下SimplePageCachingFilter 與 Spring各種都會創建一個CacheManager 這樣在服務器啟動時就會報錯。

后來通過分析源代碼解決了此問題。

在SimplePageCachingFilter當中我們看它是如何獲取CacheManager的

 

    protected CacheManager getCacheManager() {
        return CacheManager.getInstance();
    }

 

我們通過覆寫這個方法 讓它讀取我們的 ehcache.xml

    @Override
    protected CacheManager getCacheManager() {
        URL url = getClass().getResource("/ehcache.xml");
        return CacheManager.create(url);
    }

上面就完成了對CacheManager的管理 接下來就還需要配置Spring的CacheManager 讓他倆都讀取同一個文件就可以了。

    <!-- 配置Ehcache緩存管理器,讀取配置文件 -->
    <bean id="ehCacheManagerFactoryBean" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
        <property name="configLocation" value="classpath:ehcache.xml"></property>
        <property name="shared" value="true"></property>
    </bean>
    
    <!-- 配置緩存管理器,獲取cache -->
    <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" >
        <property name="cacheManager" ref="ehCacheManagerFactoryBean" />
    </bean>
shared:這個屬性需要設置為true 
因為默認情況Spring調用的是 new CacheManager()這個方法 因為上面SimplePageCachingFilter里已經創建了一個實例 所以這里在New就會拋出異常.

    public void afterPropertiesSet() throws IOException, CacheException {
        logger.info("Initializing EHCache CacheManager");
        if (this.configLocation != null) {
            InputStream is = this.configLocation.getInputStream();
            try {
                this.cacheManager = (this.shared ? CacheManager.create(is) : new CacheManager(is));
            }
            finally {
                is.close();
            }
        }
        else {
            this.cacheManager = (this.shared ? CacheManager.create() : new CacheManager());
        }
        if (this.cacheManagerName != null) {
            this.cacheManager.setName(this.cacheManagerName);
        }
    }

 



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM