SpringBoot使用@Scheduled注解实现定时任务

  1. 在项目启动类上加 @EnableScheduling 注解,用于开启定时任务,可以理解为整个项目定时任务的总开关。
@SpringBootApplication
@EnableScheduling
public class ApplicationEnter {

    public static void main(String [] args){

        SpringApplication.run(ApplicationEnter.class, args);
        System.out.println("应用启动成功");
    }
}
  1. 创建一个专门设置定时任务的类
/**
 * 定时任务Demo
 */
@Component
public class Task {

    @Scheduled(cron = "${taskCron.bisAutoCreateIssue}")
    public void execute(){
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //设置日期格式
        System.out.println("定时任务1开始执行。。。 "+ df.format(new Date()));
        Thread.sleep(1000 * 3); //等待3秒
    }

    @Scheduled(cron = "0/5 * * * * ?")
    public void execute2(){
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //设置日期格式
        System.out.println("定时任务2开始执行。。。" + df.format(new Date()));
    }
}

可以把执行定时任务的规则的cron表达式写到 application.yml 配置文件中,用${}获取,配置文件cron表达式内容如下:

taskCron:
  bisAutoCreateIssue: 0/5 * * * * * #每5秒执行一次

启动项目测试输出结果:

在这里插入图片描述


如果2个定时任务的数据互不相关,可以尝试使用异步多线程的方式来执行定时任务。

因为@Scheduled默认为单线程,开启多个任务时,需要一个定时任务执行完后,再执行下一个,任务的执行时机会受上一个任务执行时间的影响。开启多线程定时任务方法如下:

  1. 在定时任务的类上加 @EnableAsync 注解
  2. 在需要异步执行的定时任务上加上 @Async 注解
/**
 * 定时任务Demo
 */
@Component
@EnableAsync //开启多线程
public class Task {

    @Async //异步执行
    @Scheduled(cron = "${taskCron.bisAutoCreateIssue}")
    public void execute() throws InterruptedException {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //设置日期格式
        System.out.println("定时任务1开始执行。。。"+ df.format(new Date()));
        Thread.sleep(1000 * 3);
    }

    @Async //异步执行
    @Scheduled(cron = "0/5 * * * * ?")
    public void execute2(){
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //设置日期格式
        System.out.println("定时任务2开始执行。。。" + df.format(new Date()));
    }
}

使用异步之后的执行效果:

在这里插入图片描述

posted @ 2024-02-04 17:38  CharyGao  阅读(29)  评论(0编辑  收藏  举报