欢迎进入Wiki » FAQ » 如何动态配置quartz计划任务的触发器?

如何动态配置quartz计划任务的触发器?

在2013-12-02 17:42上被李小翔修改
评论 (0) · 附件 (0) · 记录 · 信息

quartz插件中,触发器是在Job类中硬编码实现的,如:
static triggers = {
    simple name:'simpleTriggerXxxx', startDelay:180000, repeatInterval:300000, repeatCount: -1
    cron name:'cronTriggerXxxx', startDelay:180000, cronExpression: '30 0/5 * * * ?'
}

这种方式虽然简单,但是非常不灵活,下面介绍两种动态配置的方式。

方式一:写一个静态的 getTriggers 方法代替静态 triggers 变量

如下代码所示,根据 Config 配置的参数来安排触发器日程。其中 MyConfig 中可以配置一个默认值,并且在工程的 Config 中可以覆盖该默认值。

import bropen.toolkit.utils.grails.GrailsUtils;

static getTriggers() {
   def config = GrailsUtils.parseConfig("Config");
    config = GrailsUtils.mergeConfig( "MyConfig", config );
   if ( !config.xxxx.disable ) {
       return {
            simple( [repeatInterval: (Long) config.xxxx.interval] )
       }
   } else {
       return {}
   }
}

注:由于 getTriggers 方法调用的时机非常早,甚至连Domain类的各个动态查询方法都还没有注入,因此这种方案的局限性很大。

方式二:不写 triggers,在 BootStrap 等地方,调用 quartz 插件为 Job 类动态注入的 schedule 方法来设置执行日程

好在 quartz 插件为 Job 类注入了各种动态方法,如 schedule、triggerNow 等,因此可以借用这些方法来实现动态排程。

// 不设置 triggers 的 Job 类
class FoobarJob {
   def execute() {
       //....
   }
}

// 启动后再排程
class BootStrap {
   def init = { servletContext ->
        FoobarJob.schedule("0 30 0 * * ?"); // cron
       FoobarJob.schedule(60*1000, -1);    // simple
   }
}
标签: BroToolkit quartz
在2013-12-02 17:41上被李小翔创建

Copyright © 2013 北京博瑞开源软件有限公司
京ICP备12048974号