我正在尝试实现grails SearchService,该服务对某些文本进行索引并将其存储在内存中,以加快查找速度。为了存储此数据,我试图在Service中使用私有(private)的静态属性来存储数据,但是该属性是随机重置值的。重新阅读文档后,我意识到这很可能是因为grails服务由于雇员的单例模式而应该是无状态的。不过,不确定我是否了解静态变量如何变化。 JVM是否为每个线程加载单独的服务类副本?不知道我是否正在围绕发生的事情。
但是,既然我知道我不能依靠静态变量来存储应用程序范围的数据,那么在保持同步和避免竞争的同时,存储和访问在整个应用程序中使用的数据的最佳方法是什么?
原因:java.lang.IllegalStateException:类[TEXTSTORE]上的方法在Grails应用程序之外使用。如果在使用模拟API或引导Grails的测试环境中正确运行。
在SearchService.buildIndex(SearchService.groovy:63)
在SearchService $ _indexAllDomains_closure2.doCall(SearchService.groovy:42)
在SearchService.indexAllDomains(SearchService.groovy:41)
在SearchService。$ tt__rebuildIndex(SearchService.groovy:48)
在SearchService.afterPropertiesSet(SearchService.groovy:35)
...另外4个
最佳答案
您似乎对Grails中的服务有些困惑。没有理由为什么服务(默认为单例)不能具有共享状态。创建服务时,服务会填充一些缓存或索引的数据,这样它可以被多个调用者使用,这种情况并不少见。
通常,这是通过实现org.springframework.beans.factory.InitializingBean
接口(interface)并利用afterPropertiesSet()
方法来完成的,该方法是在应用程序上下文中创建服务(Spring bean)并已解决所有依赖关系时调用的。
例如:
package com.example
import org.springframework.beans.factory.InitializingBean
class MyExampleService implements InitializingBean {
private List data
def otherService
void afterPropertiesSet() {
data = otherService.doSomethingToFetchData()
}
// .. other stuff
}
通过陷入Bean的生命周期,您可以相当确定地确保即使在开发中(由于更改了一些代码而重新加载服务时),它仍然具有所需的数据。
希望这可以帮助!