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

 更新时间:2022年06月30日 17:16:08   作者:老司机张师傅  
在一次SpringBoot中使用Scheduled定时任务时,发现某一个任务出现执行占用大量资源,会导致其他任务也执行失败,这篇文章主要介绍了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单线程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用@PathVariable接收两个参数

    使用@PathVariable接收两个参数

    这篇文章主要介绍了使用@PathVariable接收两个参数的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • java字符串数组进行大小排序的简单实现

    java字符串数组进行大小排序的简单实现

    下面小编就为大家带来一篇java字符串数组进行大小排序的简单实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • CGLIB代理的使用与原理解析

    CGLIB代理的使用与原理解析

    这篇文章主要介绍了CGLIB代理的使用与原理解析,静态代理和JDK 代理模式都要求目标对象是实现一个接口,但是有时候目标对象只是一个单独的对象,并没有实现任何的接口,这个时候可使用目标对象子类来实现代理,这就是Cglib代理,需要的朋友可以参考下
    2023-09-09
  • 详解Servlet3.0新特性(从注解配置到websocket编程)

    详解Servlet3.0新特性(从注解配置到websocket编程)

    Servlet3.0的出现是servlet史上最大的变革,其中的许多新特性大大的简化了web应用的开发,为广大劳苦的程序员减轻了压力,提高了web开发的效率。
    2017-04-04
  • Java中的泛型详细解析

    Java中的泛型详细解析

    这篇文章主要介绍了Java中的泛型详细解析,泛型又称参数化类型,是JDK5.0出现的新特性,解决了数据类型的安全型问题,Java泛型可以保证如果程序在编译时没用发出警告,运行时就不会产生classCastException异常,需要的朋友可以参考下
    2024-01-01
  • SpringBoot中异常处理实战记录

    SpringBoot中异常处理实战记录

    在我们实际项目开放中经常需要我们处理很多的异常,如何在spring boot项目里面实现异常处理呢,下面这篇文章主要给大家介绍了关于SpringBoot中异常处理的相关资料,需要的朋友可以参考下
    2022-05-05
  • Java如何实现判断并输出文件大小

    Java如何实现判断并输出文件大小

    这篇文章主要介绍了Java如何实现判断并输出文件大小问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • 详解Spring如何注入静态变量

    详解Spring如何注入静态变量

    这篇文章主要为大家详细介绍了Spring是如何注入静态变量的,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-06-06
  • java对象序列化与反序列化的默认格式和json格式使用示例

    java对象序列化与反序列化的默认格式和json格式使用示例

    这篇文章主要介绍了java对象序列化与反序列化的默认格式和json格式使用示例,需要的朋友可以参考下
    2014-02-02
  • SpringBoot Mybatis批量插入Oracle数据库数据

    SpringBoot Mybatis批量插入Oracle数据库数据

    这篇文章主要介绍了SpringBoot Mybatis批量插入Oracle数据库数据,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08

最新评论