使用@Scheduled完成定时任务

Spring Task;@Scheduled

从Spring 3开始,Spring自带了一套定时任务工具Spring-Task(基于注解 [@Scheduled,@EnableScheduling] 形式实现),可以把它看成是一个轻量级的Quartz,使用起来十分简单,除Spring相关的包外不需要额外的包,支持注解和配置文件两种形式。通常情况下在Spring体系内,针对简单的定时任务,可直接使用Spring提供的功能。

如果使用的是 Spring 或 Spring Boot 框架,可以直接使用 Spring Framework 自带的定时任务,使用上述定时任务的实现方式,很难实现设定了具体时间的定时任务,如当我们需要每周五来执行某项任务时,但如果使用 Spring Task 就可轻松的实现

以 Spring Boot 为例,实现定时任务只需两步:

开启定时任务

添加定时任务

1、开启定时任务

如果是在Spring Boot项目中,需要在启动类上添加@EnableScheduling来开启定时任务

@EnableScheduling // 开启定时任务
@SpringBootApplication
public class Job4ScheduledApplication {
    public static void main(String[] args) {
        SpringApplication.run(Job4ScheduledApplication.class, args);
    }
}

2、添加定时任务

定时任务的添加只需要使用 @Scheduled 注解标注即可,如果有多个定时任务可以创建多个 @Scheduled 注解标注的方法

@Component  //@Component用于实例化类,将其类托管给 Spring 容器
public class TaskJobUtil {
 
    /**
     * cron表达式:表示每2秒 执行任务
     */
    @Scheduled(cron = "0/2 * * * * ?")
    public void task() {
        System.out.println("task0-start");
        sleep(5);
        System.out.println("task0-end");
    }
 
    /**
     * fixedRate:每间隔2秒执行一次任务
     * 注意,默认情况下定时任务是在同一线程同步执行的,如果任务的执行时间(如5秒)大于间隔时间,则会等待任务执行结束后直接开始下次任务
     */
    @Scheduled(fixedRate = 2000)
    public void task0() {
        System.out.println("task0-start");
        sleep(5);
        System.out.println("task0-end");
    }
 
    /**
     * fixedDelay:每次延时2秒执行一次任务
     * 注意,这里是等待上次任务执行结束后,再延时固定时间后开始下次任务
     */
    @Scheduled(fixedDelay = 2000)
    public void task1() {
        System.out.println("task1-start");
        sleep(5);
        System.out.println("task1-end");
    }
 
    /**
     * initialDelay:首次任务启动的延时时间
     */
    @Scheduled(initialDelay = 2000, fixedDelay = 3000)
    public void task2() {
        System.out.println("task2-start");
        sleep(5);
        System.out.println("task2-end");
    }
 
    private void sleep(long time) {
        try {
            TimeUnit.SECONDS.sleep(time);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

CronTrigger(Cron触发器)功能非常强大,是基于日历的作业调度,而SimpleTrigger是精准指定间隔,所以相比SimpleTrigger,CroTrigger更加常用。CroTrigger是基于Cron表达式的

Cron 表达式是一个字符串,以5或6个空格隔开,分为6或7个域,每一个域代表一个含义

Cron的表达式被用来配置CronTrigger实例

从左到右分别为:秒、分、时、日期、月份、星期几、年份

顺序(从左到右) 允许值 允许的特殊字符
1 秒(Seconds) 0~59的整数 , - * /(四个字符)
2 分(Minutes) 0~59的整数 , - * /(四个字符)
3 小时(Hours) 0~23的整数 , - * /(四个字符)
4 日期(DayofMonth) 1~31的整数(但是你需要考虑你月的天数) ,- * ? / L W C(八个字符)
5 月份(Month) 1~12的整数 或 JAN-DEC数 , - * /(四个字符)
6 星期(DayofWeek) 1~7的整数或者 SUN-SAT (1=SUN) ,- * ? / L W C(八个字符)
7 年(可选,留空)(Year) 1970~2099 , - * /(四个字符)

crontab执行时间计算 - 在线工具
quartz/Cron/Crontab表达式在线生成工具-BeJSON.com

你可能感兴趣的:(工作中的小问题,spring,java)