admin管理员组

文章数量:1794759

【BUG】Quartz启动时初始化定时器报错

【BUG】Quartz启动时初始化定时器报错

问题

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 = triggerImplputeFirstFireTime(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