解决SpringBoot中的Scheduled单线程执行问题

目录
  • 问题描述
  • 原因分析:
  • 解决方案:
  • 补充:

问题描述

在一次SpringBoot中使用Scheduled定时任务时,发现某一个任务出现执行占用大量资源,会导致其他任务也执行失败。
类似于以下模拟场景,test1定时任务模拟有五秒钟执行时间,这时会同步影响到test2任务的执行,导致test2任务也变成五秒执行一次。

    @Scheduled(fixedRate = 1000)
    public void test1() throws InterruptedException {
        log.info(Thread.currentThread().getName() + " | task01 ");
        Thread.sleep(5000);
    }

    @Scheduled(fixedRate = 2000)
    public void test2() {
        log.info(Thread.currentThread().getName() + " | task02 ");
    }

原因分析:

经过相关资料查阅,发现Scheduled定时任务默认的线程数只有一个,进行定时任务调度时会同步的去调度,一个执行完成后再执行另一个,这是导致该问题的直接原因。

解决方案:

    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        // 设置线程数量
        taskScheduler.setPoolSize(50);
        return taskScheduler;
    }

添加一个配置,设置TaskScheduler线程数为多个,这样再执行时就会异步执行了,各个定时任务间互不影响。

补充:

使用以下Java的util包中带的TimerTask也可以进行定时任务的执行。
以下参数中TimerTask是执行的任务,0表示第一次延迟0秒执行,3000表示每3000毫秒执行一次。

						// true表示定时任务创建为守护线程
                        Timer timer = new Timer(true);
                        //timer.scheduleAtFixedRate();
                        timer.schedule(new TimerTask() {
                            @Override
                            public void run() {
                                logger.info(Thread.currentThread().getName() + "************"+ftpGaFilePrefix);
                            }
                        }, 0, 3000);

到此这篇关于SpringBoot中的Scheduled单线程执行的文章就介绍到这了,更多相关SpringBoot Scheduled单线程内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Springboot定时任务Scheduled重复执行操作

    今天用scheduled写定时任务的时候发现定时任务一秒重复执行一次,而我的cron表达式为 * 0/2 * * * * . 在源码调试的过程中,发现是我的定时任务执行过程太短导致的. 于是我另外写了个简单的定时任务 @Component public class TestJob { @Scheduled(cron = "* 0/2 * * * *") public void test() { System.out.println("测试开始"); System.o

  • springboot定时任务@Scheduled执行多次的问题

    目录 springboot定时任务@Scheduled执行多次 原因 解决方法 使用 @Scheduled 定时任务突然不执行了 springboot定时任务@Scheduled执行多次 在spring boot开发定时任务时遇到一个很怪异的现象..我进行调试模式,在没有bug的情况下.执行了三 次才停止..如图: 原因 是因为执行时间太短,在CronSequenceGenerator.class的next方法. public Date next(Date date) { Calendar ca

  • springboot使用定时器@Scheduled不管用的解决

    目录 使用定时器@Scheduled不管用 多个@Scheduled定时器不执行 解决方法 使用定时器@Scheduled不管用 如果是一开始就不能用就是没写@EnableScheduling注解,如果是用着用着不管用了 是因为@Scheduled是单线程,有定时器在工作或者没有运行完毕,所以造成了线程堵塞所以导致下一个定时器不能运行增加一个方法类 package com.llt; import org.springframework.boot.autoconfigure.batch.Batch

  • springBoot @Scheduled实现多个任务同时开始执行

    目录 @Scheduled多个任务同时开始执行 只需在springBoot启动类上添加 @Scheduled多定时任务,重叠执行 @Scheduled如果有两个定时任务 如果想要多个定时任务重叠执行 @Scheduled多个任务同时开始执行 只需在springBoot启动类上添加 如下代码即可: @Bean public TaskScheduler taskScheduler() { ThreadPoolTaskScheduler taskExecutor = new ThreadPoolTas

  • SpringBoot如何动态修改Scheduled(系统启动默认执行,动态修改)

    SpringBoot 动态修改Scheduled 场景: 可配置的 Scheduled 执行时间,正常的 Scheduled 是在项目启动的时候固定死的,没办法根据调用后台代码自动更新 Scheduled 执行时间 例如: 系统启动 读取时间 Cron : 0 0 3 * * ? ,通过执行后台方法 可以动态配置 Cron 时间格式,并且清楚掉原本执行任务,执行新的设置定时任务时间 1.根据 ThreadPoolTaskScheduler .ScheduledFuture 类 动态修改定时任务(

  • 解决SpringBoot中的Scheduled单线程执行问题

    目录 问题描述 原因分析: 解决方案: 补充: 问题描述 在一次SpringBoot中使用Scheduled定时任务时,发现某一个任务出现执行占用大量资源,会导致其他任务也执行失败.类似于以下模拟场景,test1定时任务模拟有五秒钟执行时间,这时会同步影响到test2任务的执行,导致test2任务也变成五秒执行一次. @Scheduled(fixedRate = 1000) public void test1() throws InterruptedException { log.info(Th

  • SpringBoot中使用@scheduled定时执行任务的坑

    目录 解决办法 1.将@Scheduled注释的方法内部改成异步执行 2.把Scheduled配置成成多线程执行 要注意什么坑 不绕弯子了,直接说这个坑是啥: SpringBoot使用@scheduled定时执行任务的时候是在一个单线程中,如果有多个任务,其中一个任务执行时间过长,则有可能会导致其他后续任务被阻塞直到该任务执行完成.也就是会造成一些任务无法定时执行的错觉 可以通过如下代码进行测试:     @Scheduled(cron = "0/1 * * * * ? ")    

  • SpringBoot中使用@Scheduled注解创建定时任务的实现

    在项目日常开发过程中,经常需要定时任务来帮我们做一些工作,如清理日志.定时任务的实现方法主要有 Timer.Quartz 以及 elastic-job Timer 实现定时任务 只执行一次的定时任务 Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { System.out.println("2000毫米后执行一次."); } }, 2000); timer.s

  • 解决springboot中配置过滤器以及可能出现的问题

    在springboot添加过滤器有两种方式: 1.通过创建FilterRegistrationBean的方式(建议使用此种方式,统一管理,且通过注解的方式若不是本地调试,如果在filter中需要增加cookie可能会存在写不进前端情况) 2.通过注解@WebFilter的方式 通过创建FilterRegistrationBean的方式创建多个filter以及设置执行顺序: 1.创建两个实现Filter接口的类TestFilter1 .TestFilter2 package com.aoxun.c

  • 解决SpringBoot中使用@Async注解失效的问题

    错误示例,同一个类中使用异步方法: package com.xqnode.learning.controller; import com.fasterxml.jackson.core.JsonProcessingException; import org.springframework.scheduling.annotation.Async; import org.springframework.web.bind.annotation.GetMapping; import org.springf

  • 解决idea中Terminal终端无法执行GIT命令+Terminal 中文乱码问题

    在使用 IDEA 进行开发的时候,经常会用到 Git 进行代码管理,如果再开一个 Docker 窗口的话,窗口切换来切换去的很不方便 为了简单方便,我们可以直接在 IDEA 中使用自带的 Terminal,这样就可以达到在 IDEA 主界面敲代码,侧边栏敲 Git 命令的效果 但是自带的 Terminal 默认的配置是 Cmd 窗口,直接使用 Git 命令会对中文进行 Unicode 转码,也就是所谓的乱码 这里简单的介绍下具体的配置流程以及使用 Git 命令会引起的中文 Unicode 编码的

  • 解决SpringBoot中@Email报错问题

    JSR303校验相关 现象:在springboot中使用@Email注解进行数据校验时,报没有该注解的错误. 解决方法: 在pom.xml中加该配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> 测试成功 ==测试成功== ![i

  • springboot中使用redis并且执行调试lua脚本

    目录 原因: 1.创建一个基本的web项目 2.配置redis 3.测试redis 的lua脚本 4.技术点 5.调试方式 1.进入服务关闭关闭正在运行的服务器 2.从命令行启动redis 3.在lua脚本中增加打印 4.运行代码 6.总结 今天有个项目需要使用redis,并且有使用脚本的需求.但是因为之前没有写过,所以还有一点点不熟悉,今天记录一下. 原因: 原子操作,redis会将整个脚本作为一个整体执行,中间不会被其他命令插入. 1.创建一个基本的web项目 文件 ->新建 -> 项目,

  • 深入剖析springBoot中的@Scheduled执行原理

    目录 springBoot @Scheduled执行原理 一.前言 二.@Scheduled使用方式 三.@Scheduled代码执行原理说明 @Scheduled 的一些坑 springBoot @Scheduled执行原理 一.前言 本文主要介绍Spring Boot中使用定时任务的执行原理. 二.@Scheduled使用方式 定时任务注解为@Scheduled.使用方式举例如下: //定义一个按时间执行的定时任务,在每天16:00执行一次. @Scheduled(cron = "0 0 1

  • 解决springboot中@DynamicUpdate注解无效的问题

    springboot 中 @DynamicUpdate 注解无效解决方案 遇到的问题 项目中使用 jpa,以前没用过,所以踩坑在所难免. 在使用过程中,要更新一条记录的某个字段,更新成功以后,发现整条记录只剩下我更新的那个字段,其他的全部为空了. 瞬间明白,这种更新是全覆盖,针对每个字段 update,实体类没赋值的字段,也直接将空值 set 过去了. 寻求解决方案 正在庆幸这么容易就解决,突然发现并没有这么简单. 群众的力量是无穷大的,我立刻就明白这个注解为什么无效,原来是搞错了它的用途. 一

随机推荐