【问题标题】:Global object in GrailsGrails 中的全局对象
【发布时间】:2013-03-13 15:07:45
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java grails groovy global-variables bootstrapping


    【解决方案1】:

    其实在检查答案之前我已经想到了一些事情。

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

     ExampleService
    

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

     def exampleService
    

    【讨论】:

      【解决方案2】:

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

      实现此目的的标准方法是 declare the object as a Spring bean in grails-app/conf/spring/resources.groovy

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

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

      def threadPool
      

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

      【讨论】:

        【解决方案3】:

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

        grailsApplication.controllerClasses.each {controller ->
        controller.metaClass.executorService = { ->
              executorService
         }
        }
        

        【讨论】:

          猜你喜欢
          • 2016-05-09
          • 1970-01-01
          • 2011-05-07
          • 2014-10-14
          • 1970-01-01
          • 2012-02-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多