4

我正在为 Grails 使用 Quartz 插件并且有一个简单的工作:

class MyJob{

   static triggers = {
       cron name: 'MyJobTrigger', cronExpression: '0 0/1 * * * ?'
   }
   def execute(){
       println "do some work"
   }
}

一切正常,工作按预期每分钟启动。

现在我希望 cron 表达式是属性驱动的,这样我就可以在不同的环境中覆盖。所以 Config.groovy 包含默认值:

myJob.cron = '0 0/1 * * * * ?'

我改变了我的班级:

   GrailsApplication grailsApplication

   static triggers = {
       cron name: 'MyJobTrigger', cronExpression: grailsApplication.config.myJob.cron
   }

当我运行我的代码时,我得到这个错误:

Caused by MissingPropertyException: No such property: grailsApplication for class: MyJob

假设这与加载/初始化 MyJob 类的方式有关,在注入 GrailsApplication 之前创建的静态触发器???GrailsApplication 的这种使用是我获取项目属性的常用方式。

我还能如何拥有一个属性驱动的 cron 触发器?

4

1 回答 1

3

遇到这个,将调度添加到 Bootstrap.groovy 工作得很好。在您的 MyJob 类中,将触发器设置为空闭包:

class MyJob {

   static triggers = {
        // Job is scheduled in Bootstrap.groovy so that it can be externalized
    }

   def execute() {
       println "do some work"
   }
}

然后在你的 Bootstrap.groovy 文件中,像这样设置它:

class BootStrap {

    def grailsApplication

    def init = { servletContext ->
        MyJob.schedule(grailsApplication.config.myJob.cron)
    }
}
于 2013-09-04T14:05:44.143 回答