SpringBoot学习要点记录(四)----定时任务,异步定时任务

1.使用步骤

  • 在启动类上加上@EnableScheduling注解,表示开启定时任务
  • 在任务类上加上@Scheduled()注解,并设置参数,参数配置如下
配置项 类型 详细描述
cron String 使用表达式的方式定义任务执行时间
zone String 设定区域时间
fixedDelay long 从上一个任务完成开始到下一个任务开始的间隔,单位为毫秒
fixedDelayString String 与 fixedDelay相同只是使用字符串,这样可以使用SpEL来引入配置文件的配置
initialDelay long 在SpringloC容器完成初始化后,首次任务执行延迟时间,单位为毫秒
initialDelayString String 与initialDelay相同,只是使用字符串,这样可以使用SpEL来引入配置文件的配置
fixedRate long 从上一个任务开始到下一个任务开始的间隔,单位为毫秒
fixedRateString String 与fixedRate相同,只是使用字符串,这样可以使用SpEL来引入配置文件的配置

ps:注意 fixedDelay 和 fixedRate 的区别
关于cron 表达式可自行百度,可根据需要在线生成

测试:

/**** imports ****/
@Service
public class ScheduleServiceImpl {
    // 计数器
    int count1 = 1;
    int count2 = 1;
    
    // 每隔1秒执行一次
    @Scheduled(fixedRate = 1000)
    public void task1() {
        System.out.println("【" +Thread.currentThread().getName()+"】"
                + "【task1】每秒钟执行一次,执行第【" + count1 + "】次");

        count1 ++;
    }

    @Scheduled(fixedRate = 1000)
    public void task2() throws Exception{
        System.out.println("【" +Thread.currentThread().getName()+"】"
                + "【task2】每秒钟执行一次,执行第【" + count2 + "】次");
        count2 ++;
    }
}

输出:

【scheduling-1】【task2】每秒钟执行一次,执行第【1】次
【scheduling-1】【task1】每秒钟执行一次,执行第【1】次
【scheduling-1】【task2】每秒钟执行一次,执行第【2】次
【scheduling-1】【task1】每秒钟执行一次,执行第【2】次
【scheduling-1】【task2】每秒钟执行一次,执行第【3】次
【scheduling-1】【task1】每秒钟执行一次,执行第【3】次
 ......

2.配置异步定时任务

步骤

  • 在启动类上补充@EnableAsync注解,作用:开启 Spring 异步方法执行功能
  • 在任务方法或类上加上@Async注解,作用:该方法或类需要异步线程执行。加在类上指该类所有方法都需要异步执行,加在方法上指方法需要异步执行。
    注意:@EnableAsync和@Async两个注解缺一不可。
@Service
public class ScheduleServiceImpl {
    // 计数器
    int count1 = 1;
    int count2 = 1;
    
    // 每隔1秒执行一次
    @Scheduled(fixedRate = 1000)
    // 使用异步执行
    @Async
    public void task1() {
        System.out.println("【" +Thread.currentThread().getName()+"】"
                + "【task1】每秒钟执行一次,执行第【" + count1 + "】次");
        count1 ++;
    }

    @Scheduled(fixedRate = 1000)
    @Async
    public void task2() throws Exception{
        System.out.println("【" +Thread.currentThread().getName()+"】"
                + "【task2】每秒钟执行一次,执行第【" + count2 + "】次");
        count2 ++;
    }
}

结果:
从输出结果可以看出线程名称是不一样的。

【task-1】【task2】每秒钟执行一次,执行第【1】次
【task-2】【task1】每秒钟执行一次,执行第【1】次
【task-3】【task2】每秒钟执行一次,执行第【2】次
【task-4】【task1】每秒钟执行一次,执行第【2】次
【task-5】【task2】每秒钟执行一次,执行第【3】次
【task-6】【task1】每秒钟执行一次,执行第【3】次
 ......
发布了25 篇原创文章 · 获赞 2 · 访问量 843

猜你喜欢

转载自blog.csdn.net/Laputa219/article/details/103682649