Spring Boot多个定时任务阻塞问题的解决方法

 更新时间:2022年01月04日 16:38:25   作者:不才陈某  
在日常的项目开发中,往往会涉及到一些需要做到定时执行的代码,下面这篇文章主要给大家介绍了关于Spring Boot多个定时任务阻塞问题的解决方法,需要的朋友可以参考下

前言

今天这篇文章介绍一下Spring Boot 中 如何开启多线程定时任务?

为什么Spring Boot 定时任务是单线程的?

想要解释为什么,一定要从源码入手,直接从@EnableScheduling这个注解入手,找到了这个ScheduledTaskRegistrar类,其中有一段代码如下:

protected void scheduleTasks() {
  if (this.taskScheduler == null) {
   this.localExecutor = Executors.newSingleThreadScheduledExecutor();
   this.taskScheduler = new ConcurrentTaskScheduler(this.localExecutor);
  }
}

如果taskScheduler为null,则创建单线程的线程池:Executors.newSingleThreadScheduledExecutor()。

多线程定时任务如何配置?

下面介绍三种方案配置多线程下的定时任务。

1、重写SchedulingConfigurer#configureTasks()

直接实现SchedulingConfigurer这个接口,设置taskScheduler,代码如下:

@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        //设定一个长度10的定时任务线程池
        taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));
    }
}

2、通过配置开启

Spring Boot quartz 已经提供了一个配置用来配置线程池的大小,如下;

spring.task.scheduling.pool.size=10

只需要在配置文件中添加如上的配置即可生效!

3、结合@Async

@Async这个注解都用过,用来开启异步任务的,使用@Async这个注解之前一定是要先配置线程池的,配置如下:

    @Bean
    public ThreadPoolTaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();
        poolTaskExecutor.setCorePoolSize(4);
        poolTaskExecutor.setMaxPoolSize(6);
        // 设置线程活跃时间(秒)
        poolTaskExecutor.setKeepAliveSeconds(120);
        // 设置队列容量
        poolTaskExecutor.setQueueCapacity(40);
        poolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 等待所有任务结束后再关闭线程池
        poolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
        return poolTaskExecutor;
    }

然后在@Scheduled方法上标注@Async这个注解即可实现多线程定时任务,代码如下:

 @Async
    @Scheduled(cron = "0/2 * * * * ? ")
    public void test2() {
        System.out.println("..................执行test2.................");
    }

总结

本篇文章介绍了Spring Boot 中 实现多线程定时任务的三种方案,你喜欢哪一种?

到此这篇关于Spring Boot多个定时任务阻塞问题解决的文章就介绍到这了,更多相关SpringBoot多定时任务阻塞内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java处理Markdown格式转换为Word文档

    Java处理Markdown格式转换为Word文档

    这篇文章主要为大家详细介绍了如何使用Java实现处理Markdown格式转换为Word文档,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下
    2025-03-03
  • java调用短信猫发短信示例

    java调用短信猫发短信示例

    这篇文章主要介绍了java调用短信猫发短信示例,需要的朋友可以参考下
    2014-04-04
  • 一文搞懂hashCode()和equals()方法的原理

    一文搞懂hashCode()和equals()方法的原理

    这篇文章主要介绍了详解hashCode()和equals()的本质区别和联系,本文先对两种方法作了介绍,然后对二者联系进行分析,具有一定参考价值,需要的朋友可以了解下
    2020-06-06
  • java中Map接口常用的方法解读

    java中Map接口常用的方法解读

    这篇文章主要介绍了java中Map接口常用的方法解读,Map接口是双列集合,它的每一个元素都包含一个键对象key和值对象Value,键和值对象之间存在一种对应关系,称为映射,需要的朋友可以参考下
    2024-01-01
  • Springboot 整合maven插口调用maven release plugin实现一键打包功能

    Springboot 整合maven插口调用maven release plugin实现一键打包功能

    这篇文章主要介绍了Springboot 整合maven插口调用maven release plugin实现一键打包功能,整合maven-invoker使程序去执行mvn命令,结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • 彻底解决tomcat中文乱码问题方案

    彻底解决tomcat中文乱码问题方案

    这篇文章主要介绍了彻底解决tomcat中文乱码问题方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • spring注解在自定义jar包中无法被扫描的解决方案

    spring注解在自定义jar包中无法被扫描的解决方案

    这篇文章主要介绍了spring注解在自定义jar包中无法被扫描的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java的JSON格式转换库GSON的初步使用笔记

    Java的JSON格式转换库GSON的初步使用笔记

    GSON是Google开发并在在GitHub上开源的Java对象与JSON互转功能类库,在Android开发者中也大受欢迎,这里我们就来看一下Java的JSON格式转换库GSON的初步使用笔记:
    2016-06-06
  • SpringBoot集成WebSocket实现后台向前端推送信息的示例

    SpringBoot集成WebSocket实现后台向前端推送信息的示例

    这篇文章主要介绍了SpringBoot集成WebSocket实现后台向前端推送信息的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 在SpringBoot中配置日期格式化的方法详解

    在SpringBoot中配置日期格式化的方法详解

    通常情况下,发起一个 Http 请求,Spring Boot 会根据请求路径映射到指定 Controller 上的某个方法的参数上,接着,Spring 会自动进行类型转换,对于日期类型的参数,Spring 默认是没有配置如何将字符串转换成日期类型的,本文将给大家介绍在SpringBoot中配置日期格式化的方法
    2023-10-10

最新评论