问题
Quartz定时任务项目启动时,初始化定时器报错:
Based on configured schedule, the given trigger 'DEFAULT.TASK_82' will never fire.
原因
定时任务表中存在执行时间大于当前时间的记录。
/**
* 项目启动时,初始化定时器
*/
@PostConstruct
public void init(){
List<ScheduleJobEntity> scheduleJobList = this.list();
for(ScheduleJobEntity scheduleJob : scheduleJobList){
CronTrigger cronTrigger = ScheduleUtils.getCronTrigger(scheduler, scheduleJob.getJobId());
//如果不存在,则创建
if(cronTrigger == null) {
ScheduleUtils.createScheduleJob(scheduler, scheduleJob);
}else {
ScheduleUtils.updateScheduleJob(scheduler, scheduleJob);
}
}
}
解决方式
1:项目启动前删除表(SCHEDULE_JOB)中的cron表达式有误的记录数据,项目启动成功;
2:在初始化定时器中添加对cron的检验,代码如下:
修改后初始化方法
/**
* 项目启动时,初始化定时器
*/
@PostConstruct
public void init(){
List<ScheduleJobEntity> scheduleJobList = this.list();
for(ScheduleJobEntity scheduleJob : scheduleJobList){
CronTrigger cronTrigger = ScheduleUtils.getCronTrigger(scheduler, scheduleJob.getJobId());
//如果不存在,则创建
if(cronTrigger == null) {
if(ScheduleUtils.isValidateCanDoExpression(scheduleJob.getCronExpression())){
//校验定时任务是否可以执行
ScheduleUtils.createScheduleJob(scheduler, scheduleJob);
}else {
//删除过期任务
ScheduleUtils.deleteScheduleJob(scheduler, scheduleJob.getJobId());
}
}else {
ScheduleUtils.updateScheduleJob(scheduler, scheduleJob);
}
}
}
isValidateCanDoExpression方法
/**
* 校验cron表达式是否能执行
* @param cron
* @return
*/
public static boolean isValidateCanDoExpression(String cron) {
//先校验cron表达式格式是否正确
if(!isValidExpression(cron)) {
return false;
}
CronTriggerImpl triggerImpl = new CronTriggerImpl();
try {
triggerImpl.setCronExpression(cron);
} catch (ParseException e) {
// TODO Auto-generated catch block
logger.info("定时任务cron校验【{}】,过期无法执行", cron);
return false;
}
Date date = triggerImpl.computeFirstFireTime(null);
return date != null && date.after(new Date());
}
isValidExpression方法
/**
* 校验cron表达式格式
* @param cron
* @return
*/
public static boolean isValidExpression(String cron){
if(StringUtils.isEmpty(cron)){
return false;
}
return CronExpression.isValidExpression(cron);
}
修改后项目重新启动,不再报错了。
至此问题已经解决,文章若有不足之处,欢迎指正。