2015-04-15 28 views
1

我有每日cron工作,应该在00:00在所有时区运行,但随后应用程序处于维护状态(可能是一两个小时),计划作业的一部分会丢失。如何在Quartz中运行错过的作业?

是否可以运行在维护期间错过的任务?

我已经配置石英下面的参数(/grails-app/conf/quartz.properties):

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX 
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate 
org.quartz.jobStore.tablePrefix = qrtz_ 

org.quartz.jobStore.misfireThreshold = 60000 
org.quartz.jobStore.isClustered = false 
org.quartz.jobStore.dataSource = quartzDS 

org.quartz.dataSource.quartzDS.driver = org.postgresql.Driver 
org.quartz.dataSource.quartzDS.URL = jdbc:postgresql://localhost:5432/database 
org.quartz.dataSource.quartzDS.user = username 
org.quartz.dataSource.quartzDS.maxConnections = 20 

org.quartz.jdbcStore = true 

我添加MISFIRE_INSTRUCTION_FIRE_ONCE_NOW选项来触发(grails quartz plugin):

class DailyReportJob { 

    static triggers = { 
     DateTimeZone.availableIDs.each { tzID -> 
      cron([ 
       name: tzID, 
       cronExpression: '0 1 0 * * ?', 
       timeZone: TimeZone.getTimeZone((String)tzID), 
       misfireInstruction: CronTrigger.MISFIRE_INSTRUCTION_FIRE_ONCE_NOW 
      ]) 
     } 
    } 

    def execute(context) { 
     // ... 
    } 
} 

但是没有什么变化,错过了工作仍然无法运行。

石英shoutdown前(从qrtz_triggers记录):

sched_name  | quartzScheduler 
trigger_name | America/Yakutat 
trigger_group | GRAILS_TRIGGERS 
job_name  | myapp.jobs.DailyReportJob 
job_group  | GRAILS_JOBS 
description | 
next_fire_time | 1429171260000 
prev_fire_time | -1 
priority  | 5 
trigger_state | WAITING 
trigger_type | CRON 
start_time  | 1429170209000 
end_time  | 0 
calendar_name | 
misfire_instr | 1 
job_data  | \x 

石英后开始:

sched_name  | quartzScheduler 
trigger_name | America/Yakutat 
trigger_group | GRAILS_TRIGGERS 
job_name  | myapp.jobs.DailyReportJob 
job_group  | GRAILS_JOBS 
description | 
next_fire_time | 1429257660000 
prev_fire_time | -1 
priority  | 5 
trigger_state | WAITING 
trigger_type | CRON 
start_time  | 1429171539000 
end_time  | 0 
calendar_name | 
misfire_instr | 1 
job_data  | \x 
+0

我发现奇怪的行为:在检查哪些任务错过之前,石英(也许石英插件)从数据库中删除所有记录并添加新的。 – AndreyT

+0

是的,它的bug是https://grails.org/plugin/quartz – AndreyT

+0

所以我报告bug到 jira:https://jira.grails.org/browse/GPQUARTZ-144 – AndreyT

回答

1

难道你的触发器使用 “MISFIRE_INSTRUCTION_FIRE_ONCE_NOW” 的选项?很有可能,如果你使用的是CronTrigger,这是你想要的选项。

相关问题