ehcache spring方法缓存除非不起作用

时间:2017-10-11 09:12:40

标签: java spring caching ehcache spring-annotations

在我的项目(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服务失败时不会过期!

这是我的配置

ehcache.xml中

<?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> 

的applicationContext.xml

    <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>

0 个答案:

没有答案