在 Grails 中编写一个小型 Web 应用程序我遇到了全局对象的问题。我有一个运行线程的类 - 带有队列的 ExecutorService。
问题是在哪里创建这个类的对象,让它在 Controller 中可用?
我已经尝试过 init (BootStrap) 但没有机会在其他任何地方获取它的实例。
一般来说 - 我需要的是整个应用程序的单个实例中的一个对象,可以从模型和/或控制器访问。
在 Grails 中编写一个小型 Web 应用程序我遇到了全局对象的问题。我有一个运行线程的类 - 带有队列的 ExecutorService。
问题是在哪里创建这个类的对象,让它在 Controller 中可用?
我已经尝试过 init (BootStrap) 但没有机会在其他任何地方获取它的实例。
一般来说 - 我需要的是整个应用程序的单个实例中的一个对象,可以从模型和/或控制器访问。
一般来说 - 我需要的是整个应用程序的单个实例中的一个对象,可以从模型和/或控制器访问。
实现这一点的标准方法是将对象声明为 Spring beangrails-app/conf/spring/resources.groovy
threadPool(java.util.concurrent.Executors) { bean ->
bean.factoryMethod = "newCachedThreadPool"
}
然后在控制器/服务/等中。您可以像使用 grails 服务一样注入此 bean,即
def threadPool
但在这种情况下,您可能会发现使用executor
插件更简单,它为您定义了这样一个 bean 并处理确保后台任务可用的有效 GORM 会话的复杂性。
为什么不将Executorservice包装在 Spring Bean 中,或者使用类似的东西:
grailsApplication.controllerClasses.each {controller ->
controller.metaClass.executorService = { ->
executorService
}
}
实际上,在检查答案之前,我已经想到了一些东西。
为给定的域类(Example)和控制器(ExampleController)创建
ExampleService
并简单地包括所有需要的东西。将行为设置为@Singleton(默认)。然后在Controller中注入实例如下:
def exampleService