SpringBoot(十四)_springboot使用内置定时任务Scheduled的使用(一)

简介:

为什么使用定时?

日常工作中,经常会用到定时任务,比如各种统计,并不要求实时性。此时可以通过提前设置定时任务先把数据跑出来,后续处理起来更方便. 本篇文章主要介绍 springboot内置定时任务。

实战演示

1、pom文件

pom 包里面只需要引入 Spring Boot Starter 包即可,Spring Boot Starter 包中已经内置了定时的方法。我这里方便演示,增加了lombok

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

2、启动类开启定时

@SpringBootApplication
@EnableScheduling
public class ScheduledApplication {

    public static void main(String[] args) {
        SpringApplication.run(ScheduledApplication.class, args);
    }
}

3、创建定时任务实现类

这里并没有直接在类中写cron语句,而是写到了配置文件中。一般实际项目中这样写。

3.1、ScheduledTask 类
/**
 * @author: curry
 * @Date: 2018/10/10
 */
@Component
@Slf4j
public class ScheduledTask {
    @Scheduled(cron = "${job.schedule}")
    private void process1() {
        log.info("start");
    }

}
3.2 application.properties
job.schedule = */5 * * * * ? 

4、执行结果

2018-10-10 22:48:55.001  [pool-1-thread-1] demo.ScheduledTask     : start
2018-10-10 22:49:00.001  [pool-1-thread-1] demo.ScheduledTask     : start
2018-10-10 22:49:05.001  [pool-1-thread-1] demo.ScheduledTask     : start
2018-10-10 22:49:10.001  [pool-1-thread-1] demo.ScheduledTask     : start
2018-10-10 22:49:15.001  [pool-1-thread-1] demo.ScheduledTask     : start

corn 语法说明

cron 每位的含义

cron 一共有 7 位,最后一位是年,Spring Boot 定时方案中只需要设置 6 位即可:

- 第一位,表示秒,取值 0-59;
- 第二位,表示分,取值 0-59;
- 第三位,表示小时,取值 0-23;
- 第四位,日期天/日,取值 1-31;
- 第五位,日期月份,取值 1-12;
- 第六位,星期,取值 1-7,星期一、星期二…;
注:不是第1周、第2周的意思,另外:1表示星期天,2表示星期一。
- 第七位,年份,可以留空,取值 1970-2099。

cron 符号含义

(*)星号:可以理解为每的意思,每秒、每分、每天、每月、每年……。
(?)问号:问号只能出现在日期和星期这两个位置,表示这个位置的值不确定,每天 12 点执行,所以第六位星期的位置是不需要关注的,就是不确定的值。同时,日期和星期是两个相互排斥的元素,通过问号来表明不指定值。
(-)减号:表达一个范围,如在小时字段中使用“10-12”,则表示从 10~12 点,即 10、11、12。
(,)逗号:表达一个列表值,如在星期字段中使用“1,2,4”,则表示星期天、星期一、星期三。
(/)斜杠:如 x/y,x 是开始值,y 是步长,比如在第一位(秒) 0/15 就是,从 0 秒开始,每 15 秒,最后就是 0、15、30、45、60,另 */y,等同于 0/y。

举个栗子

0 0 1 * * ?     每天 1 点执行。
0 5 1 * * ?     每天 1 点 5 分执行。
0-5 * * * * ?   每分钟的0/1/2/3/4/5 秒执行
0 5/10 1 * * ?  每天 1 点的 5 分、15 分、25 分、35 分、45 分、55 分这几个时间点执行。
0 5 1 ? * 1     每周星期天,1点5分 执行,注:1 表示星期天。  
0 10 3 ? * 1#3  每个月的第 三 个星期,星期天执行,# 号只能出现在星期的位置。

fixedRate 说明

这个日常工作中很少用到,这里不做详细介绍

@Scheduled(fixedRate = 6000) :上一次开始执行时间点之后 6 秒再执行。
@Scheduled(fixedDelay = 6000) :上一次执行完毕时间点之后 6 秒再执行。
@Scheduled(initialDelay=1000, fixedRate=6000) :第一次延迟 1 秒后执行,之后按 fixedRate 的规则每 6 秒执行一次。

总结

其实,使用内置的定时任务还是很方便的,需要注意的是,它是单线程的。

相关文章
|
5月前
|
Java 调度 Spring
SpringBoot多个@Scheduled注解的方法,会阻塞吗
【6月更文挑战第9天】SpringBoot多个@Scheduled注解的方法,会阻塞吗
481 5
|
6月前
|
SQL Java 调度
SpringBoot使用@Scheduled定时任务录入将要过期任务数据
SpringBoot使用@Scheduled定时任务录入将要过期任务数据
122 0
|
6月前
|
Java 调度 Maven
Springboot实战篇--Springboot框架通过@Scheduled实现定时任务
Spring Boot的Scheduled定时任务无需额外Maven依赖,通过`@EnableScheduling`开启。任务调度有两种方式:fixedRate和fixedDelay,前者任务结束后立即按设定间隔执行,后者在任务完成后等待设定时间再执行。更灵活的是cron表达式,例如`0 0 3 * * ?`表示每天3点执行。实现定时任务时,需注意默认单线程执行可能导致的任务交错,可通过自定义线程池解决。
149 0
|
6月前
|
Java Spring
springboot自带的@Scheduled注解开启定时任务
springboot自带的@Scheduled注解开启定时任务
180 0
|
6月前
|
XML Java 调度
SpringBoot中定时任务入门(@Scheduled )详解
SpringBoot中定时任务入门(@Scheduled )详解
843 0
|
12月前
|
Java
springboot计划任务@EnableScheduling和@Scheduled
springboot计划任务@EnableScheduling和@Scheduled
springboot工程如何设置定时任务详解(@Scheduled)以及cron表达式
springboot工程如何设置定时任务详解(@Scheduled)以及cron表达式
|
Java Maven Spring
SpringBoot整合定时任务----Scheduled注解实现(一个注解全解决)
一、使用场景 定时任务在开发中还是比较常见的,比如:定时发送邮件,定时发送信息,定时更新资源,定时更新数据等等…
111 2
SpringBoot整合定时任务----Scheduled注解实现(一个注解全解决)
|
缓存 NoSQL Java
SpringBoot定时任务@Scheduled的多线程使用
@Scheduled是Spring框架中的一个注解,它可以用于配置定时任务,使得方法可以按照规定的时间间隔定时执行。在使用该注解时,我们可以指定任务的执行时间、循环周期、并发数等参数,从而实现定时任务的功能。在Spring Boot中,@Scheduled注解可以直接应用于方法上。
441 0
|
存储 NoSQL Java
SpringBoot集成Redis业务功能 02、定时任务+Redis删除特定前缀key的优雅实现
SpringBoot集成Redis业务功能 02、定时任务+Redis删除特定前缀key的优雅实现