Spring 定时任务

目录

一、创建项目

二、cron 表达式

2.1 符号讲解

三、使用定时任务

3.1 单线程实现

3.2 异步多线程实现


视频链接:学习中心|视频播放页 (boxuegu.com)https://xuexi.boxuegu.com/lesson/?id=1598

使用的idea版本:2022.3

一、创建项目

在 pom.xml 文件中添加以下内容

    <!--spring-boot-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.11</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <dependencies>
        <!--web启动器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

二、cron 表达式

在线Cron表达式生成器 (qqe2.com)https://cron.qqe2.com/

注意:国外是以周日为一周的第一天,所以 DayofWeek 中的 1-7 是指周日到周六

2.1 符号讲解

通用符号:

  • ,  表示列出枚举值。例如:在 Minutes 域使用 5,20 表示在时间的分钟数为 5、20 时触发事件
  • -  表示范围。例如在 Minutes 域使用 5-20 表示在时间为 5 到 20 时每分钟都触发事件
  • *  表示匹配该域的任意值。假如在 Minutes 域使用 * 表示时间分钟数不做限制,每分钟都触事件
  • /  表示起始时间开始触发,然后每隔固定时间触发一次。例如在 Minutes 域使用 5/20 表示时间的分钟数为 5 时触发一次,后隔 20 分钟即 25、45 再分别触发一次

专有符号:

  • ?只能用在 DayofMonth 和 DayofWeek 两个域,由于 DayofMonth 和 DayofWeek 互斥,需对其一设置 ?
  • L  表示最后,只能出现在 DayofMonth 和 DayofWeek 域。如果在 DayofWeek 域使用 5L,意味着在最后的一个星期四触发
  • W  表示有效工作日  (周一到周五),只能出现在 DayofMonth 域,系统将在离指定日期的最近的有效工作日触发事件
  • LW  这两个字符可以连用,表示在某个月的最后一个工作日
  • #  用于确定每个月第几个星期几,只能出现在 DayofWeek 域。例如在 4#2,表示某月的第二个星期三(#号后面表示第几个,#号前面表示每个星期的第几天)
  • C  只能用在 DayofMonth 和 DayofWeek 两个域,需要关联日历,如果没关联可以忽略

注意:

  • 专有符号中除了 ? 外,在 Spring 定时任务中都不支持

三、使用定时任务

3.1 单线程实现

  • 在启动类上添加注解 @EnableScheduling
@SpringBootApplication
@EnableScheduling // 开启对定时任务的支持
public class TaskApplication {
    public static void main(String[] args) {
        SpringApplication.run(TaskApplication.class, args);
    }
}
  • 在任务方法上添加注解 @Scheduled,并设置定时规则
@Component
public class Task {
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    @Scheduled(cron = "*/6 * * * * *") //每6秒打印当前时间
    public void getTime() {
        String time = dateFormat.format(new Date());
        System.out.println(time);
    }
}
  • 运行效果

3.2 异步多线程实现

默认是单线程的定时任务,如果任务持续时间较长,就会将和后续定时任务拖延,导致丢失任务。

  • 在启动类上添加注解 @EnableScheduling@EnableAsync
@SpringBootApplication
@EnableScheduling // 开启对定时任务的支持
@EnableAsync // 开启异步
public class TaskApplication {
    public static void main(String[] args) {
        SpringApplication.run(TaskApplication.class, args);
    }
}
  • 在任务方法上添加注解 @Scheduled,并设置定时规则,然后再添加注解 @Async
@Component
public class Task {
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
    @Async // 异步
    @Scheduled(cron = "*/6 * * * * *") //每6秒打印当前时间
    public void getTime1() {
        System.out.println(Thread.currentThread().getName() + "-" + dateFormat.format(new Date()));
    }
    @Async // 异步
    @Scheduled(cron = "*/6 * * * * *") //每6秒打印当前时间
    public void getTime2() {
        System.out.println(Thread.currentThread().getName() + "-" + dateFormat.format(new Date()));
    }
}
  • 运行效果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值