如何动态配置quartz计划任务的触发器?
李小翔
2013-12-02 17:42

内容列表

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
    } 
}