2017-04-22 10 views
0

私はプロジェクト設定を持っています(ここでの抜粋はGitHub https://github.com/ashishmarwal/self-populating-cache-issueで作成したデモプロジェクトからのものです) raw eh-cacheキャッシュがehcache config(ehcache.xml)です。SelfPopulatingCache現職のキャッシュの問題(Spring 4、EhCache 2.10.3)

<cache name="alphabet-description-cache" 
     eternal="false" 
     maxElementsInMemory="1000" 
     memoryStoreEvictionPolicy="LRU" 
     overflowToDisk="false" 
     timeToLiveSeconds="300" 
     timeToIdleSeconds="300" /> 

のSpring Bean記述子は、その後CacheEntryFactoryを使用して装飾された(SelfPopulatingCache)を作成するために、その生のキャッシュを使用しています。

<bean id="springCacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"> 
    <property name="cacheManager" ref="cacheManager"/> 
</bean> 

<!--Creating a decorated cache instance using the raw cache cinfigured in ehcache.xml --> 
<bean id="alphabetDescriptionCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean"> 
    <property name="cacheManager" ref="cacheManager"/> 
    <property name="cacheName" value="alphabet-description-cache"/> 
    <property name="cacheEntryFactory" ref="alphabetDescriptionCacheEntryFactory"/> 
</bean> 

<bean id="alphabetDescriptionCacheEntryFactory" class="com.marwals.ashish.issues.selfpopulatingcache.AlphabetDescriptionCacheEntryFactory" /> 

我々はまた、あるテストのcontext.xmlを持っていますユニットテストに使用され、デコレートされたキャッシュと同様にcacheManagerも宣言しています(私の見解では、これらのキャッシュマネージャに異なる名前を付けました):

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> 
    <property name="cacheManagerName" value="self-populating-cache-issue-demo-test"/> 
    <property name="shared" value="true"/> 
    <property name="acceptExisting" value="false"/> 
    <property name="configLocation" value="classpath:/ehcache.xml"/> 
</bean> 

<bean id="springCacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"> 
    <property name="cacheManager" ref="cacheManager"/> 
</bean> 

<bean id="alphabetDescriptionCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean"> 
    <property name="cacheManager" ref="cacheManager"/> 
    <property name="cacheName" value="alphabet-description-cache"/> 
    <property name="cacheEntryFactory" ref="alphabetDescriptionCacheEntryFactory"/> 
</bean> 

<bean id="alphabetDescriptionCacheEntryFactory" class="com.marwals.ashish.issues.selfpopulatingcache.AlphabetDescriptionCacheEntryFactory" /> 

ここでの問題は、私は、メインまたはテスト・コンテキストビーン記述子のいずれか、それぞれの負荷二つの異なるテストを持っている場合、私は現職のキャッシュの問題に実行することです:

Error creating bean with name 'alphabetDescriptionCache' defined in class path resource [test-context.xml]: Invocation of init method failed; 
nested exception is net.sf.ehcache.CacheException: Cannot replace alphabet-description-cache It does not equal the incumbent cache. 

任意のアイデアは、何ができますかここで間違っている?コードをデバッグすると、同じ生のキャッシュに対して2つの異なるキャッシュインスタンスがあり、EhCacheのキャッシュマネージャによってエラーとして発生していることがわかります。

私はこの問題を実証Gitのリポジトリを作成しました: https://github.com/ashishmarwal/self-populating-cache-issue

感謝を!

答えて

0

あなたは明示的にこれはEhcacheのは、常に与えられた構成で同じCacheManagerを返すことを意味します

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> 
    <property name="cacheManagerName" value="self-populating-cache-issue-demo"/> 
    <property name="shared" value="true"/> <!-- here --> 
    <property name="acceptExisting" value="false"/> 
    <property name="configLocation" value="classpath:/ehcache.xml"/> 
</bean> 

あなたのSpring構成で共有キャッシュマネージャを要求しました。あなたの場合(そして一般的に)あなたはそれを望んでいません。

sharedfalseを設定するだけで問題は解決します。

+0

ありがとう@Henri。私はこれを試してみる。私の本当のシナリオには、テストスプリングのコンテキストを持つテストがたくさんありますが、実際のスプリングコンテキストはいくつかあります。だからここ数人と議論した後、本当のスプリングコンテキストを使っているものは、統合テストを宣言して、単体テストを実行するための確実なフォークVMとは別に実行する必要があることに気付きました。 –

+0

一般に、共有されたSpringアプリケーションコンテキストを持つため、共有キャッシュマネージャは必要ありません。共有キャッシュマネージャを推移的に提供します。だからあなたはどんなやり方でも、キャッシュマネージャは共有されるべきです。 – Henri