【发布时间】:2015-11-19 11:03:41
【问题描述】:
在 Play framework 2.2 中创建当前请求的结果非常简单。我们只输入:
Ok(views.html.default.render())
然后让它工作就足够了,用Action来包装,所以最终的代码如下:
def index = Action {
Ok(views.html.default.render())
}
没关系。但是现在,我想将响应存储在缓存中以使其更具可扩展性。我使用 EHCache。问题是,当我将它存储到缓存中时,它会抛出
NotSerializableException: play.api.mvc.ActionBuilder$$anon$1
我试图至少缓存它自己的结果,但它抛出了
ERROR net.sf.ehcache.store.disk.DiskStorageFactory Disk Write of result-key failed:
java.io.NotSerializableException: play.api.libs.iteratee.Enumerator$$anon$18
我知道,这些值存储在缓存中,但仅存储在内存中,考虑到真正的高负载和许多不同的响应,这可能是非常不够的。
问题:
所以我的问题是,是否有任何方法可以完全缓存 Play 操作/结果,包括正确的序列化?
编辑:
我如何尝试使用缓存:我不使用Cached {},因为它的行为并不完全符合我的需要,所以我尝试以自己的方式设计它。因此,出于测试目的,我现在更详细地使用它:
Cache.set("myaction", Action {
Ok(views.html.default.render())
})
或
Cache.set("myresponse", Ok(views.html.default.render()))
但这两者都会产生上述异常。
关于缓存:Play 缓存 API 对我来说是不够的,所以我通过另外几个方法和新的插件实现来扩展它。起初我尝试只复制默认插件并实现这些扩展,但有一些问题,所以我修复了它们,推荐here。这是插件修复。从那时起,它似乎实际上使用了 EHCache(从那些异常中猜测)。
【问题讨论】:
-
如何将结果存储到缓存中?
-
@mantithetical 请看我的编辑
标签: caching playframework-2.0 ehcache