【发布时间】:2016-07-18 15:22:18
【问题描述】:
我试图实现一个 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 更多
【问题讨论】:
-
嗯,当您的代码更改导致服务重新加载时,您是否看到这些服务在生产或开发过程中不可靠?自 Grails 1.x 以来,我一直在使用各种方法在服务中保持共享状态(例如查找或索引数据),并且从未在生产中看到过这种情况。一次都没有。
-
正在开发中。如果服务抛出 NPE 错误并且未明确捕获(仍在解决一些错误),则该问题是可重现的。这种情况下类会重新加载吗?
-
如果您更改类,它们会在开发中重新加载,因此这实际上可能是您看到此问题的原因。您确实应该通过挂钩到 bean 生命周期并让它在启动时重新填充/加载它的数据来使您的服务更加可靠。通常让您的服务实现
org.springframework.beans.factory.InitializingBean和afterPropertiesSet()是这样做的一个很好的介绍。 -
谢谢,乔希。没有考虑过,会调查的。
标签: grails service singleton stateless