@Scheduled定时器

发布时间:2026/7/21 16:03:55
@Scheduled定时器 @Scheduled定时器一、基本使用二、参数说明fixedDelayfixedRateinitialDelaycron三、cron 表达式参数说明实用性的案例四、@Scheduled注意事项五、配置文件1、fixedDelay2、fixedRate3、cron一、基本使用@Scheduled// 由Spring定义,用于将方法设置为调度任务。如:定时执行一次或定时轮询执行一段代码。该注解放到需要定时执行的方式上@EnableScheduling// 再项目启动类上添加注解@EnableScheduling,表示开启定时任务@Scheduled(fixedDelay=20*1000)//每隔20秒执行publicvoidscheduledTaskByFixedDelay(){log.info("定时任务开始 ByFixedDelay:"+DateUtils.getDatetimeString());Stringstr="Hello,,,World,,,每20秒,,,指定参数FixedDelay,,,";ListMapString,Stringlist=helloService.getTemp();log.info(str+JSON.toJSONString(list));log.info("定时任务结束 ByFixedDelay:"+DateUtils.getDatetimeString());}@SpringBootApplication@EnableSchedulingpublicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.run(Application.class,args);}}二、参数说明fixedDelay上一次任务执行完毕时间点之后多长时间再执行,任务的执行要等上一个任务执行结束。它的间隔时间是根据上次的任务结束的时候开始计时的。比如一个方法上设置了 fixedDelay=10*1000,那么当该方法某一次执行结束后,开始计算时间,当时间达到10秒,就开始再次执行该方法。@Scheduled(fixedDelay=10000)//每隔10秒执行@Scheduled(fixedDelay=60*60*1000)//每隔1小时执行fixedRate上一次任务开始执行点之后指定时间后再执行(如果执行时间超过了间隔时间,那上一次任务执行完之后,立即执行下一个任务)fixedRate 理解起来比较麻烦,它的间隔时间是根据上次任务开始的时候计时的。比如当方法上设置了 fiexdRate=5000,该执行该方法所花的时间是2秒,那么3秒后就会再次执行该方法。但是这里有个坑,当任务执行时长超过设置的间隔时长,那会是什么结果呢。打个比方,比如一个任务本来只需要花2秒就能执行完成,我所设置的fixedRate=5000,但是因为网络问题导致这个任务花了7秒才执行完成。当任务开始时Spring就会给这个任务计时,5秒钟时候Spring就会再次调用这个任务,可是发现原来的任务还在执行,这个时候第二个任务就阻塞了(这里只考虑单线程的情况下,多线程后面再讲),甚至如果第一个任务花费的时间过长,还可能会使第三第四个任务被阻塞。被阻塞的任务就像排队的人一样,一旦前一个任务没了,它就立马执行。@Scheduled(/