Grails Cache和EHCache Plugin缓存控制器方法,但不缓存服务方法

时间:2014-11-14 17:03:30

标签: grails caching plugins ehcache grails-2.0

我无法使用Grails EHCache插件来缓存服务方法。这是我的设置:

Grails 2.4.2,JDK 1.7

BuildConfig.groovy compile ":cache-ehcache:1.0.4"

Config.groovy定义了名为“cache”

的以下缓存
grails.cache.config = {
    cache {
        name 'cache'
        timeToLiveSeconds 60
    }
}

以下控制器方法正确缓存。我已经通过在方法中设置断点进行了测试,并且只在第一次命中时才进行测试,直到缓存过期。

@Cacheable('cache')
def index() {
    render "index-$params.id"
}

我可以用以下方法检查缓存中的键:

grailsCacheManager.getCache('cache').getNativeCache().getKeys()

并查看值:

localhost:GET:/grails-cache-test/cache/index?id=34

到目前为止一切顺利。

存在以下服务方法:

@Cacheable('cache')
public method1(id) {
    "method1+$id"
}

我在这里设置了一个断点,无论@Cacheable注释如何,总是调用此方法。我已尝试手动设置valuekey注释属性,但没有更改。我测试从非缓存控制器方法调用此方法,以及直接从控制台插件调用此方法。当我在服务方法中获得密钥时,我发现没有设置密钥。

我查看了官方文档中的示例,在线代码示例,github,我的书,一切看起来都不错,所以我不确定问题出在哪里。

有关此服务方法为何不缓存该值的任何想法?谢谢!

更新1

我一直在深入研究grails cache-1.1.8插件(以及相关的cache-ehcache-1.0.4插件),相信我发现了一些有用的东西。在PageFragmentCachingFilter.doFilter()中,有人要求检查控制器的注释 - 但没有检查服务。结果似乎是服务注释永远不会受到尊重。有很多文档提到了服务方法,所以我不知道其他地方是否有处理这种情况的东西,或者与控制器方法相比它是不太常见的用例。

更新2

控制器和服务似乎是单独处理的。在CacheAspectSupport.execute()中有一个for()循环,它将调用cachePutRequest.apply(result.get());,它实际上会将条目添加到缓存中。不幸的是,在将条目添加到请求后,它不能立即被检索。底层的put()代码是Spring Source的一部分,所以在这一点上我不确定它是grails插件问题还是Spring Source问题。

我为此插件GPCACHEEHCACHE-16

创建了一个JIRA问题

0 个答案:

没有答案