我试图实现一个 grails SearchService 索引某些文本并将其存储在内存中以便更快地查找。为了存储这些数据,我试图在服务中使用私有(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
}
通过 Hook bean 的生命周期,您可以相当确定即使在开发中(当您的服务因更改了某些代码而重新加载时)它仍然具有所需的数据。
关于grails - 你如何处理无状态 grails 服务中的共享数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36311947/