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