SpringBoot定时任务

1.定时器

定时任务,在企业开发中尤其重要,很多业务都需要定时任务去完成。例如10点开售某件商品,凌晨0点统计注册人数,一级统计其他各种信息等;

这时候不可能人为的去开启某个开关或者人为的统计某些数据,如果这样,估计执行任务者都要崩溃了。

(一)SpringBoot定时器的使用一般有以下几种实现方式

1.Timer:

这是Java自带的java.util.Timer类,这个类允许调度一个java.util.TimerTask任务。使用这种方式可以让程序按照某一个频率执行,

但不能在指定时间运行,一般用的很少。

2.ScheduledExecutorService:

也jdk自带的一个类,是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是任务是并发执行的,

他们之间互不影响。

3.SpringTask:

Spring 3.0以后自带的Task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单多了

4.Quartz:

这是一个功能比较强大的调度器,可以让程序在指定的时间执行,也可以按照某一个频率执行,配置起来稍显复杂。

简单的定时任务可以直接通过Spring自带的task来实现,

复杂的定时任务则可以通过集成Quartz来实现


2.Task

Task是Spring自带的定时器,使用方便简单。使用方式如下。

1.创建工程

首先创建一个Spring Boot Web工程项目

2.开启定时任务

在启动类添加@EnableScheduling注解,开启对定时任务的支持

@SpringBootApplication
@EnableScheduling
public class JwtDemoApplication {
​
    public static void main(String[] args) {
        SpringApplication.run(JwtDemoApplication.class, args);
    }
​
}

3.设置定时任务

定时任务要通过@Scheduled注解来实现

package com.frank.component;
​
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
​
import java.util.Date;
​
​
@Component
public class ScheduledTask {
​
    private Logger logger= LoggerFactory.getLogger(ScheduledTask.class);
​
    @Scheduled(cron = "0 0/1 * * * ?")
    public void testOne(){
        logger.info("每分钟执行一次");
    }
​
    @Scheduled(fixedDelay = 30000)
    public void testTwo(){
        logger.info("每30秒执行一次");
    }
​
    @Scheduled(cron = "0 0 1 * * ?")//每天凌晨1点执行
    public void initTask(){
        //执行任务
        logger.info("执行任务"+new Date());
    }
​
}

配置完成后,启动SpringBoot项目,观察控制台日志打印信息

SpringBoot定时任务_第1张图片

 

3.表达式说明

字段 允许值 允许的特殊字符
0-59 , - * /
0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * / L W C
月份 1-12或者JAN-DEC , - * /
星期 1-7或者SUN-SAT , - * /L C #
年(可选) 留空,1970-2099 , - * /

工三的表达式所示:

(1) “*“字符被用来指定所有的值。如:“、”在分钟的字段域里表示“每分钟”

2)“-”字符被用来指定一个范围。如:“10-12”在小时域里表示“10点,11点、12点”

(3)“,”字符被用来指定另外的值。如:“MON,WED,FRI在星期域里表示“星期一星期三、星期五”

(4) “?”字符只在日期城和星期城中使用。它被用来指定“非明确的值”。当需要通过在这两个域中的一个来指定某日期或星期几的时候,它是有用的。看一看下面所举的例子 就会明白。

(5)“L”字符指定在月或者星期中的某天(最后一天)。即“Las”的缩写。但是在星期和月中“L”表示不同的意思,如:在月子段中“L”指月份的最后一天,例如1月31日和2月 28日,如果在星期字段中则简单地表示为“7”或者“SAT”。 值的后面,则表示“某月的最后一个星期value” ,如“6L.”表示某月的最后一个星期五。 如果在星期字段中在某个value

(6)“W”字符只能用在月份字段中,该字段指定了离指定日期最近的那个星期日

(7)“#”字符只能用在星期字段,该字段指定了第几个星期 value 在某月中。每一个元素都可以显式地规定一个值(如6),一个区间(如9~12),一个列表(如9,1113)或一个通配符(如)。 “月份中的日期”和“星期中的日期”这两个元素是互斥的,因此应该通过设置一个问号(?)来表明不想设置的那个字段。

注意:Cron表达式对特殊字符的大小写不敏感,对代表星期的缩写英文大小写也不 敏感。

你可能感兴趣的:(spring,boot,java,spring)