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

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

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

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

2.1 多任务并发执行

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

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

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

   @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 ▼同一任务的异步执行(下次任务将在下一个配置时间开始,不等待当前任务执行完毕)

    @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 ,怪不得每次只能执行一个定时任务,以下是部分源码

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注解才会被扫描到,使配置生效

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;
    }
}

欢迎关注我的微信公众号 "抓几个娃",聊点技术 聊点生活

以上

Spring Boot提供了异步定时任务的支持。在Spring中,我们可以使用@EnableScheduling注解来启用定时任务的功能,使用@Scheduled注解来标记一个方法为定时任务。同时,我们可以使用TaskExecutor和TaskScheduler接口来实现异步执行任务调度。 在绝大多数的Java应用中,很多场景都是采用同步的方式进行交互。但是如果涉及到与第三方进行交互,可能会出现交互延迟的问题。为了解决这个问题,Spring在3版本之后内置了异步任务的支持,可以使用异步任务来处理这种情况。 在定时任务中,有时候可能会遇到执行时长不确定的情况。但是如果需要固定间隔执行任务,可以使用@Scheduled注解的initialDelay和fixedDelay属性来实现。另外,如果需要控制同一时间只允许一个线程执行部分代码,可以使用AtomicBoolean来实现。具体的代码实现可以参考上述引用\[3\]中的示例。 总结起来,Spring Boot提供了异步定时任务的支持,可以通过@EnableScheduling和@Scheduled注解来实现。同时,可以使用TaskExecutor和TaskScheduler接口来实现异步执行任务调度。如果需要固定间隔执行任务或控制同一时间只允许一个线程执行部分代码,可以使用@Scheduled注解的属性或AtomicBoolean来实现。 #### 引用[.reference_title] - *1* *2* [SpringBoot实现异步任务以及定时任务](https://blog.csdn.net/qq_41153943/article/details/124944826)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Springboot异步定时任务限制某方法同一时间只允许一个线程去运行](https://blog.csdn.net/New_Yao/article/details/126771642)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值