问题

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

修改后项目重新启动,不再报错了。


至此问题已经解决,文章若有不足之处,欢迎指正。

更多推荐

【BUG】Quartz启动时初始化定时器报错-Based on configured schedule, the given trigger 'DEF