我有每天的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我在触发器(grails quartz plugin)中添加了MISFIRE_INSTRUCTION_FIRE_ONCE_NOW选项:
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) {
// ...
}
}但是什么都没有改变,错过的作业仍然不能运行。
在Quartz 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 | \xQuartz启动后:
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发布于 2015-04-15 22:45:31
您的触发器是否使用了"MISFIRE_INSTRUCTION_FIRE_ONCE_NOW“选项?很可能,如果您使用的是CronTrigger,这就是您想要的选项。
https://stackoverflow.com/questions/29653182
复制相似问题