如何处理无状态grails服务中的共享数据

时间:2016-03-30 14:31:09

标签: grails service singleton stateless

我试图实现一个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个

1 个答案:

答案 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的生命周期,你可以相当确定即使在开发中(当你的服务重新加载,因为你已经改变了一些代码),它仍然会有所需的数据。

希望这有帮助!