- 📚 相关推荐文章
- SpringCloud Alibaba 整合 Dubbo 、Nacos 及No provider available from registry报错解决方案 推荐
- Spring CloudBoot启动报错Consider defining a bean of type ServerCodecConfigurer 推荐
- spring框架报错:java.lang.NoClassDefFoundError: orgspringframeworkaopTargetSource 推荐
- Spring框架中@Resource注解报错解决方案 推荐
- Spring框架(SpringBoot)中redis报错(Could not get a resource from the pool、java.net.SocketTimeoutException) 推荐

【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); }修改后项目重新启动,不再报错了。
至此问题已经解决,文章若有不足之处,欢迎指正。
👁️ 阅读量:0
© 版权声明:本文《【BUG】Quartz启动时初始化定时器报错》内容均为本站精心整理或网友自愿分享,如需转载请注明原文出处:https://www.zastudy.cn/wen/1686477160a263958.html。