在我的项目(Java Spring 3.2)中,我有一个用@Cacheable
注释修饰的方法,我使用ehcache。
缓存工作正常,除非修饰代码抛出异常
@Override
@Cacheable(value = "fooById", key = "'idFoo ' + #idFoo" , unless="#result == null")
public Foo getFooById(Integer idFoo, boolean valueA,
boolean valueB) {
try{
//private method that call a web service
Foo theFoo = getFoo(fooById);
return foo;
}
catch(Exception e){
return null;
}
}
当我在这里阅读https://stackoverflow.com/a/15775379/4341748时,我期待为具有相同idFoo的下一次调用执行修饰方法。 我无法弄清楚为什么这不会发生。
我注意到的另一个问题是第二个调用没有从缓存中返回任何内容而LOG.debug
没有被执行
private void method(Integer id){
Foo myFoo = fooService.getFooById(id, false, false);
LOG.debug("foo received from cache or web services:" + foo.getName());
}
当Web服务返回正确的值时,缓存再次过期。 相反,缓存仍然被阻止,并且在Web服务失败时不会过期!
这是我的配置
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd"
name="mySharedCache"
updateCheck="false" monitoring="autodetect"
maxBytesLocalHeap="100M"
dynamicConfig="false">
<diskStore path="javax.servlet.context.tempdir"/>
<defaultCache eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="false"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120">
</defaultCache>
<cache
name="getFooById"
eternal="false"
overflowToDisk="false"
diskPersistent="false"
timeToLiveSeconds="120">
<cacheDecoratorFactory class="it.solinfo.leonardo.sintesi.utils.BlockingCacheDecoratorFactory" />
</cache>
<beans>
<cache:annotation-driven />
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cacheManager-ref="ehcache"/>
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:shared="true"/>
</beans>