org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount: 1 org.quartz.threadPool.threadPriority: 5 设置临界时间为6秒 org.quartz.jobStore.misfireThreshold: 6000设置任务每个5秒执行一次job.properties
job.xxx.class=com.uelink.dkapi.job.RemindJob job.xxx.group=default job.xxx.id=1 job.xxx.cron=*/5 * * * * ? job.xxx.enable=true注意:xxx表示名字随意取 在定时任务中编写延迟RemindJob.java 休眠10秒,相当于任务执行时间为10s
public class RemindJob implements Job{ @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("微信小程序定时提醒通知开始"); DateFormat df = new SimpleDateFormat("hh:mm:ss"); System.err.println("[" + Thread.currentThread().getName() + "] Now: " + df.format(context.getFireTime()) + " Scheduled: " + df.format(context.getScheduledFireTime()) + " Previous: " + df.format(context.getPreviousFireTime()) + " Next: " + df.format(context.getNextFireTime())); try { Thread.sleep(10 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } System.err.println("线程休眠结束时间:"+df.format(new Date(System.currentTimeMillis()))); } }
产生错失情况 条件 org.quartz.jobStore.misfireThreshold时间6秒 每隔5秒执行一次, 一次执行10秒 结果为
Now: 06:22:20 Scheduled: 06:22:20 Previous: 06:22:15 Next: 06:22:25 Now: 06:22:30 Scheduled: 06:22:25 Previous: 06:22:20 Next: 06:22:30 Now: 06:22:40 Scheduled: 06:22:40 Previous: 06:22:25 Next: 06:22:45 Now: 06:22:50 Scheduled: 06:22:45 Previous: 06:22:40 Next: 06:22:50 Now: 06:23:00 Scheduled: 06:23:00 Previous: 06:22:45 Next: 06:23:05查看上面的Scheduled,是定时任务原本执行的时间。 第一个22:20, 第二个22:25, 第三个22:30, 第四个22:35,第五个22:40,第六个22:45,第七个22:50 第二个 30-25=5<6,认为没有产生错失。执行第二个 第三个25到40 40-30>6 ,产生错失,不执行第三个。 第四个原本是35,不知道是不是因为第三个发生错失后,小于40的任务都不执行,第四个被略过。 22:40直接执行第五个 第六个 40-45=5<6 ,没有措施,执行第六个 第七个22:50, 23:00-22:50=10>6产生错失,第六个不执行,第七个22:55不执行 第八个执行 当我们设置临界时间为60秒时。 条件 org.quartz.jobStore.misfireThreshold时间60秒 每隔5秒执行一次, 一次执行10秒 结果
Now: 06:05:25 Scheduled: 06:05:25 Previous: 06:05:20 Next: 06:05:30 Now: 06:05:35 Scheduled: 06:05:30 Previous: 06:05:25 Next: 06:05:35 Now: 06:05:45 Scheduled: 06:05:35 Previous: 06:05:30 Next: 06:05:40 Now: 06:05:55 Scheduled: 06:05:40 Previous: 06:05:35 Next: 06:05:45 Now: 06:06:05 Scheduled: 06:05:45 Previous: 06:05:40 Next: 06:05:50所有的定时任务都会被执行,知道超出临界时间为止 第一次任务原本开始时间和任务真正开始时间差为0 第二次5 第三次10 第四次15 需要在13次才能达到60,才会产生错失情况。 如果我们每隔一天才执行一次时,由于任务执行时间远远小于两次任务的时间间隔,不会产生错失情况,不需要担心定时任务没有执行的意外。只需要设置这个临界时间为60秒即可。 而且一般情况下都是多线程执行定时任务,不会因为定时任务阻塞产生错失策略。不需要关心这个参数设置