当前位置: 首页 > news >正文

SpringBoot中定时任务开启多线程避免多任务堵塞

场景

SpringBoot中定时任务与异步定时任务的实现:

SpringBoot中定时任务与异步定时任务的实现_霸道流氓气质的博客-CSDN博客

使用SpringBoot原生方式实现定时任务,已经开启多线程支持,以上是方式之一。

除此之外还可通过如下方式。

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

查看注解@EnableScheduling源码可知

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

 

为了验证单线程,所以编写模拟堵塞的测试方法

import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.concurrent.TimeUnit;@Component
@EnableScheduling
public class TestTask {@Scheduled(fixedRateString = "15000")public void  test1() throws InterruptedException {System.out.println("task1:"+LocalDateTime.now());//moni  yanchiTimeUnit.SECONDS.sleep(10);}@Scheduled(fixedRateString = "3000")public void  test2() {System.out.println("task2:"+LocalDateTime.now());}
}

执行结果

注:

博客:
霸道流氓气质_C#,架构之路,SpringBoot-CSDN博客

实现

1、方案一

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

添加如下配置

spring:task:scheduling:pool:size: 10

再次进行堵塞测试发现正常

2、方案二

重写SchedulingConfigurer#configureTasks()

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import java.util.concurrent.Executors;//直接实现SchedulingConfigurer这个接口,设置taskScheduler
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));}
}

3、方案三

参考上面结合@Async的方式。

http://www.lryc.cn/news/97590.html

相关文章:

  • 回归预测 | MATLAB实现SO-CNN-BiLSTM蛇群算法优化卷积双向长短期记忆神经网络多输入单输出回归预测
  • 入侵检测——IDS概述、签名技术
  • golang 标准库json Marshal 序列化与反序列化
  • 【【51单片机AD/DA的分析】】
  • 在docker中安装使用达梦数据库
  • Leetcode-每日一题【剑指 Offer II 010. 和为 k 的子数组】
  • 【JavaScript】使用Promise来处理异步调用,方法传入参数为接口,并回调接口的方法
  • grid map学习笔记1之Ubuntu18.04+ROS-melodic编译安装grid_map栅格地图及示例运行
  • postgres wal2json插件jsonb字段数据丢失问题解决
  • 华为eNSP:路由引入
  • Retrospectives on the Embodied AI Workshop(嵌入式人工智能研讨会回顾) 论文阅读
  • 「JVM」Full GC和Minor GC、Major GC
  • Asp.Net MVC 使用Log4Net
  • [元带你学: eMMC协议 29] eMMC 断电通知(PON) | 手机平板电脑断电通知
  • vue使用recorder-core.js实现录音功能
  • ThinkPHP8知识详解:给PHP8和MySQL8添加到环境变量
  • UE使用UnLua(二)
  • Appium+python自动化(二十五)-获取控件ID(超详解)
  • SDWAN组网的九大应用场景
  • el-date-picker时间范围只能选五分钟之内
  • 大数据分析案例-基于LightGBM算法构建乳腺癌分类预测模型
  • Java中的io流
  • 23 自定义控件
  • 从原理到实践,分析 Redisson 分布式锁的实现方案(二)
  • QT【day3】
  • 模版模式和策略模式的区别
  • Github搭建个人博客全攻略
  • gensim conherence model C_V 值与其他指标负相关BUG
  • QT DAY3
  • TortoiseGit(小乌龟)使用问题总结