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

标签 grails service singleton stateless

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

相关文章:

mysql - 第一个查询的 Grails/Mysql 问题

grails - GORM对象的打印ID

android - 当我的服务运行 TimerTask 时,如何防止 UI 挂起?

go - 我应该避免在 golang 中使用包单例吗?

grails - grails jasper插件报告pdf显示

grails - 为什么 Grails 服务类是单例的?

Android远程服务不调用服务方法

php - Laravel 服务类在没有服务提供者的情况下也能工作吗?

c++ - 继承单例

javascript - Javascript 中的单例模式与全局变量用例?