我试图实现一个grails SearchService,它将某些文本编入索引并将其存储在内存中以便更快地查找。为了存储这些数据,我试图在服务中使用私有静态属性来存储数据,但该属性是随机重置值。在重新阅读文档后,我意识到这可能是因为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个
答案 0 :(得分:2)
你似乎对Grails中的服务有点困惑。没有理由为什么服务(默认为单例)不能具有共享状态。服务在创建时填充某些缓存或索引数据并因此可供多个调用者使用,这种情况并不少见。
大多数情况下,这是通过实现org.springframework.beans.factory.InitializingBean
接口并使用在应用程序上下文中创建服务(Spring bean)时调用的afterPropertiesSet()
方法完成的,并且所有依赖项都是解决。
例如:
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的生命周期,你可以相当确定即使在开发中(当你的服务重新加载,因为你已经改变了一些代码),它仍然会有所需的数据。
希望这有帮助!