专栏首页java系列博客spring boot默认单线程排队跑定时任务问题记录

spring boot默认单线程排队跑定时任务问题记录

作者:小小明童鞋

链接:https://my.oschina.net/xiaomingnevermind/blog/3143095

问题描述:在使用springboot默认的定时任务时,若存在多个任务,框架默认只启动一个线程执行,会导致有些任务不能在指定时间开始执行

另,关于分布式下定时任务同步锁问题,会再单独写一篇记录

测试默认情况下定时任务的线程名称:

package com.example.demo.job;

import net.javacrumbs.shedlock.core.SchedulerLock;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

@Component
@EnableScheduling
public class TestJob {


    @Scheduled(cron = "0/5 * * * * ?")
    @SchedulerLock(name = "test1-task", lockAtMostForString = "PT28M", lockAtLeastForString = "PT28M")
    public void execute1() {
        String curName = Thread.currentThread().getName();
        System.out.println("当前时间:" + LocalDateTime.now() + "  任务execute1对应的线程名: " + curName);
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Scheduled(cron = "0/5 * * * * ?")
    @SchedulerLock(name = "test2-task", lockAtMostForString = "PT28M", lockAtLeastForString = "PT28M")
    public void execute2() {

        String curName = Thread.currentThread().getName();
        System.out.println("当前时间:" + LocalDateTime.now() + "  任务execute2对应的线程名: " + curName);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Scheduled(cron = "0/10 * * * * ?")
    @SchedulerLock(name = "test3-task", lockAtMostForString = "PT28M", lockAtLeastForString = "PT28M")
    public void execute3() {

        String curName = Thread.currentThread().getName();
        System.out.println("当前时间:" + LocalDateTime.now() + "  任务execute3对应的线程名: " + curName);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

结果如下:

spring boot 自带的定时任务默认只起一个线程:

这种情况下,对于有些定时任务若设定在某一固定时刻开始执行,就可能出现需要排队而不能准时执行的情况。然后找了下解决方案,我不太想巴拉源码了,网上大家都扒出来了,就是为空初始化一个线程那段,直接点上解决方案:

在启动类里面加上如下代码:

/**
	 *  解决定时任务单线程排队问题,建立线程池
	 * @return
	 */
	@Bean
	public TaskScheduler taskScheduler() {
		ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
		taskScheduler.initialize();
		taskScheduler.setPoolSize(50);
		return taskScheduler;
	}

然后重新启动看下线程的情况:

以及核心线程数:

这样就解决了单线程问题。

另:分布式情况下只能有一个定时任务在执行,防止重复执行的方案有很多,下次再写。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Thread.join()的用法

    小小明童鞋
  • 深入理解Java内存模型(三)——顺序一致性

    小小明童鞋
  • jdk1.7hashMap源码分析

    所以,1.7和1.8的hashmap到底有哪些不同呢:     1.hash的取值算法不同     2.求数组下标的算法不同     3.1.8的实体是N...

    小小明童鞋
  • 定时任务调度与管理平台JobCenter | crontab替代者

    没有JobCenter时我们要面对的: 电商业务链条很长,业务逻辑也较为复杂,需要成百上千种定时任务。窝窝的大多数定时任务其实调用的是本地或远端 Java/PH...

    小小科
  • 拨开云雾见天日——数据安全治理体系

    )级别[1]。随着企业业务发展和扩大,应用环境的数据越来越庞大,多种多样、复杂多变。面临的数据安全问题和威胁越来越突出和严峻,不仅有来自外界的攻击,也有内部管理...

    绿盟科技研究通讯
  • 2020全球数据安全标准和认证展望

    本文参考信标委TC260数据安全标准体系研究,将分别对国际标准组织ISO、国际电信联盟ITU-T、美国国家标准组织NIST、我国国家数据安全标准组织TC 26...

    云鼎实验室
  • Linux定时任务简述

    在Linux中,可以用来做定时任务的有好几个软件,我们只说基于cron服务的crontab

    信安本原
  • 先声夺人|《2020年数据安全典型实践案例》云鼎获荐

    ? 点击上方蓝字关注我们 ? ? 9月14日,由中国国际智能产业博览会组委会、中国网络空间安全协会主办的“2020数据安全高峰论坛”在重庆市成功举行。论坛围绕...

    云鼎实验室
  • 50亿美元代价的背后,企业该如何做好数据安全?(文末赠书)

    随着大数据时代的到来,数据的价值越来越重要,往往成为机构或者企业最宝贵的财富甚至涉及商业机密。在此次新冠肺炎疫情期间,数字技术第一次全链条、全方位、全周期地介入...

    杰哥的IT之旅
  • 腾讯安全首发企业级「数据安全能力图谱」

    当前数字化发展,无论是国家机关、企事业单位,还是普通自然人,对数据安全的关注和重视都是空前的,可以说数据安全是当前的热门话题、共性话题。国家、地方、企事业内部都...

    腾讯安全

扫码关注云+社区

领取腾讯云代金券