前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot @Scheduled注解使用: 同步/异步同一任务及多任务并发执行

SpringBoot @Scheduled注解使用: 同步/异步同一任务及多任务并发执行

作者头像
botkenni
发布2022-09-07 14:34:51
1.5K0
发布2022-09-07 14:34:51
举报
文章被收录于专栏:IT码农IT码农

    本文将介绍@Scheduled注解使用过程中:

1.1 同一任务的同步执行(下次任务执行将在本次任务执行完毕后的下一次配置时间开始)

1.2 同一任务的异步执行(下次任务将在下一个配置时间开始,不等待当前任务执行完毕)

2.1 多任务并发执行

首先,要想使用@Scheduled注解,首先要在启动类上添加注解@EnableScheduling

代码语言:javascript
复制
@SpringBootApplication
@EnableScheduling
public class CsdnfwApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(CsdnfwApplication.class, args);
    }
 
}

1.1 ▼同一任务的同步执行(下次任务执行将在本次任务执行完毕后的下一次配置时间开始)

代码语言:javascript
复制
   @Scheduled(cron = "*/30 * * * * ?")
    public void ipWriter() throws InterruptedException {
        for(int i=0;i<20;i++){
            System.out.println("1:"+i);
            Thread.sleep(5000);
        }
    }

SpringBoot 默认就是定时任务同步执行的,只要将@Scheduled添加到需要配置的任务方法上,下次任务执行开始将在本次任务执行完毕后才开始

1.2 ▼同一任务的异步执行(下次任务将在下一个配置时间开始,不等待当前任务执行完毕)

代码语言:javascript
复制
    @Async
    @Scheduled(cron = "*/30 * * * * ?")
    public void ipWriter() throws InterruptedException {
        for(int i=0;i<20;i++){
            System.out.println("1:"+i);
            Thread.sleep(5000);
        }
    }

需要在方法体上添加@Async 注解

2.1 ▼多任务并发执行(划重点,这是一个坑)

我在使用SpringBoot配置定时任务的过程中,使用@Scheduled配置了多个定时任务,但是在项目启动的时候每次只会启动一个定时任务,只好搜索一波,直到看到了 ThreadPoolTaskScheduler的源码,才发现默认开启的线程数是 1 ,怪不得每次只能执行一个定时任务,以下是部分源码

代码语言:javascript
复制
public class ThreadPoolTaskScheduler extends ExecutorConfigurationSupport implements AsyncListenableTaskExecutor, SchedulingTaskExecutor, TaskScheduler {
    private volatile int poolSize = 1;
    
    public void setPoolSize(int poolSize) {
        Assert.isTrue(poolSize > 0, "'poolSize' must be 1 or higher");
        this.poolSize = poolSize;
        if (this.scheduledExecutor instanceof ScheduledThreadPoolExecutor) {
            ((ScheduledThreadPoolExecutor)this.scheduledExecutor).setCorePoolSize(poolSize);
        }

    }
}

可以看到poolSize的默认值是1,那现在就好办了,在启动的时候重新配置一番即可▼

创建BeanConfig类,注意,需要在类上添加@Component注解,项目启动的时候类中的@Bean注解才会被扫描到,使配置生效

代码语言:javascript
复制
package com.liufei.beanConfig;

import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.stereotype.Component;

/**
 * @Author DemoLiu
 * @Date 2018/12/29 10:18
 * @description
 */

@Component
public class BeanConfig {

    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(2);//我这里设置的线程数是2,可以根据需求调整
        return taskScheduler;
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-09-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档