1

在 Grails 中编写一个小型 Web 应用程序我遇到了全局对象的问题。我有一个运行线程的类 - 带有队列的 ExecutorService。

问题是在哪里创建这个类的对象,让它在 Controller 中可用?

我已经尝试过 init (BootStrap) 但没有机会在其他任何地方获取它的实例。

一般来说 - 我需要的是整个应用程序的单个实例中的一个对象,可以从模型和/或控制器访问。

4

3 回答 3

3

一般来说 - 我需要的是整个应用程序的单个实例中的一个对象,可以从模型和/或控制器访问。

实现这一点的标准方法是将对象声明为 Spring beangrails-app/conf/spring/resources.groovy

threadPool(java.util.concurrent.Executors) { bean ->
  bean.factoryMethod = "newCachedThreadPool"
}

然后在控制器/服务/等中。您可以像使用 grails 服务一样注入此 bean,即

def threadPool

但在这种情况下,您可能会发现使用executor插件更简单,它为您定义了这样一个 bean 并处理确保后台任务可用的有效 GORM 会话的复杂性。

于 2013-03-24T11:27:06.213 回答
1

为什么不将Executorservice包装在 Spring Bean 中,或者使用类似的东西:

grailsApplication.controllerClasses.each {controller ->
controller.metaClass.executorService = { ->
      executorService
 }
}
于 2013-03-24T03:12:31.563 回答
0

实际上,在检查答案之前,我已经想到了一些东西。

为给定的域类(Example)和控制器(ExampleController)创建

 ExampleService

并简单地包括所有需要的东西。将行为设置为@Singleton(默认)。然后在Controller中注入实例如下:

 def exampleService
于 2013-03-24T17:49:19.803 回答