聊聊SpringBoot的@Scheduled的并发问题

 更新时间:2021年11月02日 14:48:00   作者:正儿八经的胡说八道  
这篇文章主要介绍了聊聊SpringBoot的@Scheduled的并发问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

SpringBoot @Scheduled的并发

由于SpringBoot自带的@Scheduled是一个阻塞执行的定时任务,所以效率会很慢,就会造成同一个时间段内只有一个定时任务在执行,其余的就会阻塞

现有两个定时任务

@Component("aa")
public class aa {
    @Scheduled(cron = "0 44 17 * * ?")
    public void bb() {
        try {
            System.out.println("aa执行时间:" + new Date());
            Thread.sleep(65000);
            System.out.println("aa完成时间:" + new Date());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
@Component("bb")
public class bb {
    @Scheduled(cron = "0 55 17 * * ?")
    public void aa() {
        try {
            System.out.println("bb执行时间:" + new Date());
            Thread.sleep(10000);
            System.out.println("bb完成时间:" + new Date());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

默认的在启动项加入@EnableScheduling注解就可以运行了

在这里插入图片描述

最终,执行的结果令人大跌眼镜。

在这里插入图片描述

aa的任务由于执行时间需要65秒,超过了bb任务执行的时间,结果bb任务执行的时间被阻塞掉,延迟了5秒执行。

解决方法是在启动项类中加入如下配置即可

 @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(50);
        return taskScheduler;
    }

如果是xml

 <!-- 注解式 -->
 <task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>
 <task:executor id="myExecutor" pool-size="5"/>
 <task:scheduler id="myScheduler" pool-size="10"/>

spring @Scheduled 并发执行

spring @Scheduled ,默认基于单线程执行,如果需要基于多线程执行,需要在配置文件中配置如下

queue-capacity="500" rejection-policy="CALLER_RUNS" />
scheduler="scheduler" />

具体可以参考spring 帮助文档对annotation-driven的executor和scheduler的解释

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java中invokedynamic字节码指令问题

    Java中invokedynamic字节码指令问题

    这篇文章主要介绍了Java中invokedynamic字节码指令问题,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • Maven导入依赖时爆红的几种解决方法

    Maven导入依赖时爆红的几种解决方法

    使用idea建立maven项目,maven导入依赖报红,本文主要介绍了Maven导入依赖时爆红的几种解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • 图文详解mybatis+postgresql平台搭建步骤

    图文详解mybatis+postgresql平台搭建步骤

    从头开始搭建一个mybatis+postgresql平台,这篇文章主要介绍了图文详解mybatis+postgresql平台搭建步骤,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • mybatis-plus支持null字段全量更新的两种方法

    mybatis-plus支持null字段全量更新的两种方法

    本文主要介绍了mybatis-plus支持null字段全量更新的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 解决SpringBoot jar包中的文件读取问题实现

    解决SpringBoot jar包中的文件读取问题实现

    这篇文章主要介绍了解决SpringBoot jar包中的文件读取问题实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Java实现特定范围的完数输出算法示例

    Java实现特定范围的完数输出算法示例

    这篇文章主要介绍了Java实现特定范围的完数输出算法,简单说明了完数的概念、计算原理并结合实例形式分析了java针对给定范围内的完数输出操作实现技巧,需要的朋友可以参考下
    2017-12-12
  • SpringBoot Maven项目中Model间的最佳继承设计详解

    SpringBoot Maven项目中Model间的最佳继承设计详解

    这篇文章主要为大家详细介绍了SpringBoot中一个优秀Maven项目的各Model间最佳继承设计的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2024-01-01
  • Java线程组与未处理异常实例分析

    Java线程组与未处理异常实例分析

    这篇文章主要介绍了Java线程组与未处理异常,结合实例形式分析了java线程组处理异常的相关技巧与操作注意事项,需要的朋友可以参考下
    2019-09-09
  • Java面试必考之如何在项目中优雅的抛出异常

    Java面试必考之如何在项目中优雅的抛出异常

    这篇文章主要为大家详细介绍了Java中的几种异常关键字和异常类相关知识,本文比较适合刚入坑Java的小白以及准备秋招的大佬阅读,需要的可以收藏一下
    2023-06-06
  • JAVA中方法的声明及使用方式(继承、多态、封装)

    JAVA中方法的声明及使用方式(继承、多态、封装)

    这篇文章主要介绍了JAVA中方法的声明及使用方式(继承、多态、封装),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02

最新评论