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

目录
  • 前言
  • 1、重写SchedulingConfigurer#configureTasks()
  • 2、通过配置开启
  • 3、结合@Async
  • 总结

前言

今天这篇文章介绍一下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多定时任务阻塞内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • spring boot整合quartz实现多个定时任务的方法

    最近收到了很多封邮件,都是想知道spring boot整合quartz如何实现多个定时任务的,由于本人生产上并没有使用到多个定时任务,这里给个实现的思路. 1.新建两个定时任务,如下: public class ScheduledJob implements Job{ @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("sched

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

    目录 前言 1.重写SchedulingConfigurer#configureTasks() 2.通过配置开启 3.结合@Async 总结 前言 今天这篇文章介绍一下Spring Boot 中 如何开启多线程定时任务? 为什么Spring Boot 定时任务是单线程的? 想要解释为什么,一定要从源码入手,直接从@EnableScheduling这个注解入手,找到了这个ScheduledTaskRegistrar类,其中有一段代码如下: protected void scheduleTasks(

  • Spring Boot 多个定时器冲突问题的解决方法

    目录 战术分析 使用场景 问题场景重现 添加注解 配置类 战术分析 上次的博客疏忽了定时器的一个大重点… 实际开发项目中一定不止一个定时器,很多场景都需要用到,而多个定时器带来的问题 : 就是如何避免多个定时器的互相冲突. 推荐一个 Spring Boot 基础教程及实战示例:https://github.com/javastacks/spring-boot-best-practice 使用场景 我们的订单服务,一般会有一个待支付订单,而这个待支付订单是有时间限制的,比如阿里巴巴的订单是五天,淘

  • Spring Boot中自动化配置的利弊以及解决方法

    本文主要给大家介绍了关于Spring Boot自动化配置的利弊及解决方法的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: Spring Boot中的双刃剑:自动化配置 在之前的文章中,我们通过各种功能性示例体验了Spring Boot的自动化配置给我们所带来的超便利的新开发方式.但是,在一些情况下Spring Boot的自动化配置也会给我们惹来不少的麻烦,比如这些场景: 项目依赖复杂的情况下,由于依赖方的依赖组织不够严格,可能引入了一些实际我们不需要的依赖,从而导致我们

  • Spring Boot接收单个String入参的解决方法

    前言 接受参数是我们在日常开发中经常会遇到的一个需求,下面这篇文章主要给大家介绍了关于Spring Boot接收单个String入参之解决方案的相关内容,下面话不多说了,来一起看看详细的介绍吧 场景: 在做接口时,有的时候,接口入参只需要一个参数,如果将一个参数封装成一个对象很麻烦,故有了以下方式: 思路: spring自带的参数解析器貌似是不具备这个能力的,所有自定义 方式方法: 1.定义一个注解 @Target(ElementType.PARAMETER) @Retention(Retent

  • Spring Boot security 默认拦截静态资源的解决方法

    Spring Boot security 会默认登陆之前拦截全部css, js,img等动态资源,导致我们的公开主页在登陆之前很丑陋 像这样: 网上很多解决办法都过时了比如还在使用WebSecurityConfigurerAdapte,antMatchers public class SecurityConfigurer extends WebSecurityConfigurerAdapter { @Override public void configure(WebSecurity web)

  • Spring Boot与Kotlin定时任务的示例(Scheduling Tasks)

    在编写Spring Boot应用中会遇到这样的场景,比如:需要定时地发送一些短信.邮件之类的操作,也可能会定时地检查和监控一些标志.参数等. 创建定时任务 在Spring Boot中编写定时任务是非常简单的事,下面通过实例介绍如何在Spring Boot中创建定时任务,实现每过5秒输出一下当前时间. 在Spring Boot的主类中加入@EnableScheduling注解,启用定时任务的配置 import org.springframework.boot.SpringApplication i

  • 详解Spring Boot 中实现定时任务的两种方式

    在 Spring + SpringMVC 环境中,一般来说,要实现定时任务,我们有两中方案,一种是使用 Spring 自带的定时任务处理器 @Scheduled 注解,另一种就是使用第三方框架 Quartz ,Spring Boot 源自 Spring+SpringMVC ,因此天然具备这两个 Spring 中的定时任务实现策略,当然也支持 Quartz,本文我们就来看下 Spring Boot 中两种定时任务的实现方式. @Scheduled 使用 @Scheduled 非常容易,直接创建一个

  • Spring Boot中实现定时任务应用实践

    前言 在Spring Boot中实现定时任务功能,可以通过Spring自带的定时任务调度,也可以通过集成经典开源组件Quartz实现任务调度. 本文将详细介绍关于Spring Boot实现定时任务应用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 一.Spring定时器 1.cron表达式方式 使用自带的定时任务,非常简单,只需要像下面这样,加上注解就好,不需要像普通定时任务框架那样继承任何定时处理接口 ,简单示例代码如下: package com.power.de

  • Spring Boot如何实现定时任务的动态增删启停详解

    我以为动态停启定时任务一般用quartz,没想到还可以通过ScheduledTaskRegistrar来拓展.但是分布式场景,建议还是用quartz吧! 在 spring boot 项目中,可以通过 @EnableScheduling 注解和 @Scheduled 注解实现定时任务,也可以通过 SchedulingConfigurer 接口来实现定时任务.但是这两种方式不能动态添加.删除.启动.停止任务.要实现动态增删启停定时任务功能,比较广泛的做法是集成 Quartz 框架. 但是本人的开发原

  • Spring Boot 配置 Quartz 定时任务的方法

    Quartz有四个核心概念: Job:是一个接口,只定义一个方法 execute(JobExecutionContext context),在实现接口的 execute 方法中编写所需要定时执行的 Job(任务) Double slongitude = Double.valueOf(jobExecutionContext.getJobDetail().getJobDataMap().get("slongitude").toString()); JobDetail:Quartz 每次调度

随机推荐