聊聊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的解释

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

相关文章

  • Spring中循环依赖的解决方法详析

    Spring中循环依赖的解决方法详析

    这篇文章主要给大家介绍了关于Spring中循环依赖的解决方法,文中通过示例代码介绍的非常详细,对大家学习或者使用spring具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • java简单选择排序实例

    java简单选择排序实例

    这篇文章主要为大家详细介绍了java简单选择排序实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Java多线程通信问题深入了解

    Java多线程通信问题深入了解

    下面小编就为大家带来一篇深入理解JAVA多线程之线程间的通信方式。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-07-07
  • SpringMVC @RequestMapping注解应用方法示例讲解

    SpringMVC @RequestMapping注解应用方法示例讲解

    通过@RequestMapping注解可以定义不同的处理器映射规则,下面这篇文章主要给大家介绍了关于SpringMVC中@RequestMapping注解用法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • Jmeter如何添加循环控制器

    Jmeter如何添加循环控制器

    这篇文章主要介绍了Jmeter如何添加循环控制器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 详解Java 二叉树的实现和遍历

    详解Java 二叉树的实现和遍历

    二叉树可以简单理解为对于一个节点来说,最多拥有一个上级节点,同时最多具备左右两个下级节点的数据结构。本文将详细介绍一下Java中二叉树的实现和遍历,需要的可以参考一下
    2022-01-01
  • java Spring AOP详解及简单实例

    java Spring AOP详解及简单实例

    这篇文章主要介绍了java Spring AOP详解及简单实例的相关资料,需要的朋友可以参考下
    2017-05-05
  • Java编译和解释执行对比及原理解析

    Java编译和解释执行对比及原理解析

    这篇文章主要介绍了Java编译和解释执行对比及原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • 关于BeanUtils.copyProperties(source, target)的使用

    关于BeanUtils.copyProperties(source, target)的使用

    这篇文章主要介绍了关于BeanUtils.copyProperties(source, target)的使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • SpringBoot集成Kafka的实现示例

    SpringBoot集成Kafka的实现示例

    本文主要介绍了SpringBoot集成Kafka的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-01-01

最新评论