美文网首页
定时任务 | @scheduled

定时任务 | @scheduled

作者: 七喜丶 | 来源:发表于2022-06-17 10:50 被阅读0次

    SpringBoot为我们内置了@Scheduled定时任务,下面我们就来配置下这个注解,找到入口程序添加注解@EnableScheduling,添加注解后SpringBoot就已经认定了我们要使用定时任务来完成一些业务逻辑了,内部会对应原始配置定时任务添加对应的配置文件

    @EnableScheduling
    @SpringBootApplication
    public class SpringBootVenusApplication {
    
        public static void main(String[] args) {
            // 启动spring-boot-venus
            ConfigurableApplicationContext context = SpringApplication.run(SpringBootVenusApplication.class, args);
        }
    }
    

    @scheduled

    @scheduled注解用来配置到方法上来完成对应的定时任务的配置,如执行时间,间隔时间,延迟时间等等,下面我们就来详细的看下对应的属性配置

    下面我们来配置@Scheduled,来完成每小时输出内容

    /**
         * 每小时执行一次
         */
        @Scheduled(cron = "0 0 0/1 * * ? ")
        public void hello() throws Exception {
           System.out.println("HelloScheduled...");
        }
    

    cron属性

    Seconds : 可出现", - * /"四个字符,有效范围为0-59的整数
    Minutes : 可出现", - * /"四个字符,有效范围为0-59的整数
    Hours : 可出现", - * /"四个字符,有效范围为0-23的整数
    DayofMonth : 可出现", - * / ? L W C"八个字符,有效范围为0-31的整数
    Month : 可出现", - * /"四个字符,有效范围为1-12的整数或JAN-DEc
    DayofWeek : 可出现", - * / ? L C #"四个字符,有效范围为1-7的整数或SUN-SAT两个范围。1表示星期天,2表示星期一, 依次类推
    Year : 可出现", - * /"四个字符,有效范围为1970-2099年

    下面简单举几个例子:

    "0 0 12 * * ?" 每天中午十二点触发
    "0 15 10 ? * *" 每天早上10:15触发
    "0 15 10 * * ?" 每天早上10:15触发
    "0 15 10 * * ? *" 每天早上10:15触发
    "0 15 10 * * ? 2005" 2005年的每天早上10:15触发
    "0 * 14 * * ?" 每天从下午2点开始到2点59分每分钟一次触发
    "0 0/5 14 * * ?" 每天从下午2点开始到2:55分结束每5分钟一次触发
    "0 0/5 14,18 * * ?" 每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发
    "0 0-5 14 * * ?" 每天14:00至14:05每分钟一次触发
    "0 10,44 14 ? 3 WED" 三月的每周三的14:10和14:44触发
    "0 15 10 ? * MON-FRI" 每个周一、周二、周三、周四、周五的10:15触发


    initialDelay属性

    该属性的含义是指在项目启动后在定义的时间后开启定时任务,配合fixedRate()和fixedDelay()使用


    fixedRate属性

    该属性的含义是调用固定周期(以毫秒为单位)执行方法:就是上一次开始执行时间点之后延迟执行

        //在项目启动 5s 后,每隔 2s 调用定时任务
        @Scheduled(initialDelay = 5000, fixedRate = 2000)
        public void testScheduled() throws Exception {
            System.out.println("开启任务:" + new Date());
            //模拟任务执行所需时间
            Thread.sleep(1000);
            System.out.println("执行任务:" + new Date());
        }
    
    1. 当任务执行时间小于或等于fixedRate的参数时:定时任务以fixedRate的参数周期进行调用
    2. 当任务执行时间大于fixedRate的参数时:定时任务不以fixedRate的参数周期进行调用,而是在上一次执行完毕时间直接执行

    fixedDelay属性

    该属性的含义是上次调用结束和下一次调用结束之间的固定周期(以毫秒为单位)执行方法:就是上一次执行完毕时间点之后延迟执行。


    注意:

    1、cron、fixedDelay、fixedRate 三者之间不能共存!!!
    2、fixedDelay、fixedRate不能单独使用!!!
    会抛出一个错误:

    Caused by: java.lang.IllegalStateException: Encountered invalid @Scheduled method 'testScheduled': Exactly one of the 'cron', 'fixedDelay(String)', or 'fixedRate(String)' attributes is required.
    

    相关文章

      网友评论

          本文标题:定时任务 | @scheduled

          本文链接:https://www.haomeiwen.com/subject/fryqvrtx.html