揭开 spring-context 包中 ThreadPoolTaskScheduler 的面纱

ThreadPoolTaskScheduler轻量级多线程定时任务框架 面对一些小的功能需求点,如果需要非常灵活的进行处理定时任务处理,但是又因为你的需求需要使用到页面进行定时任务配置,显然使用Spring注解定时任务,无法满足你,这时你想到了xxl-job 或者 quezy等定时任务框架,但是过于繁琐,可能成本较大。那么本文将要解决你的问题。ThreadPoolTaskScheduler 内部方法非常丰富,本文实现的是一种corn表达式,周期执行schedule(Runnable task, Trigger trigger) corn表达式,周期执行。 阅读详情

关于上一篇文章中提到的 SpringBoot 项目中当标注 @EnableScheduling 注解时会自动配置一个 ThreadPoolTaskScheduler 任务调度执行器 bean,并且 @Scheduled 的定时任务就是由该 bean 负责执行的,之前没有看过该类中的源码 , 今天正好在做定时任务好奇心的驱使下研究了一下源码:

源码路径:org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler

首先一起看一下这个类的继承关系图:
在这里插入图片描述
类关系中主要大部分是一些接口定义了一些规范,以及做一些初始化以及停止时的一些销毁工作 (不是真正执行定时任务的主角)。

任务执行主角:
在这里插入图片描述
类内部属性中有一个ScheduledExecutorService ,ScheduledExecutorService 是一个接口,也是定义些规范。 这个接口的实现类才是主要执行任务的
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

bean 的初始化流程(创建 ScheduledExecutorService 实现类对象):
1、ExecutorConfigurationSupport.afterPropertiesSet()
2、ExecutorConfigurationSupport.initialize()
3、ThreadPoolTaskScheduler.initializeExecutor(ThreadFactory threadFactory, RejectedExecutionHandler rejectedExecutionHandler)
4、ThreadPoolTaskScheduler.createExecutor(int poolSize, ThreadFactory threadFactory, RejectedExecutionHandler rejectedExecutionHandler)

由于 ExecutorConfigurationSupport 类中的 initializeExecutor 方法是一个抽象方法,所以是在子类中实现,也就是最终初始化是调用 ThreadPoolTaskScheduler 中的initializeExecutor 方法创建一个 ScheduledExecutorService 的实现类ScheduledThreadPoolExecutor 对象作为定时任务真正执行对象


	/**
	 * Calls {@code initialize()} after the container applied all property values.
	 * @see #initialize()
	 */
	@Override
	public void afterPropertiesSet() {
		initialize();
	}

	/**
	 * Set up the ExecutorService.
	 */
	public void initialize() {
		if (logger.isInfoEnabled()) {
			logger.info("Initializing ExecutorService" + (this.beanName != null ? " '" + this.beanName + "'" : ""));
		}
		if (!this.threadNamePrefixSet && this.beanName != null) {
			setThreadNamePrefix(this.beanName + "-");
		}
		this.executor = initializeExecutor(this.threadFactory, this.rejectedExecutionHandler);
	}

	/**
	 * Create the target {@link java.util.concurrent.ExecutorService} instance.
	 * Called by {@code afterPropertiesSet}.
	 * @param threadFactory the ThreadFactory to use
	 * @param rejectedExecutionHandler the RejectedExecutionHandler to use
	 * @return a new ExecutorService instance
	 * @see #afterPropertiesSet()
	 */
	protected abstract ExecutorService initializeExecutor(
			ThreadFactory threadFactory, RejectedExecutionHandler rejectedExecutionHandler);


@Override
protected ExecutorService initializeExecutor(
		ThreadFactory threadFactory, RejectedExecutionHandler rejectedExecutionHandler) {

	this.scheduledExecutor = createExecutor(this.poolSize, threadFactory, rejectedExecutionHandler);

	if (this.removeOnCancelPolicy) {
		if (this.scheduledExecutor instanceof ScheduledThreadPoolExecutor) {
			((ScheduledThreadPoolExecutor) this.scheduledExecutor).setRemoveOnCancelPolicy(true);
		}
		else {
			logger.debug("Could not apply remove-on-cancel policy - not a ScheduledThreadPoolExecutor");
		}
	}

	return this.scheduledExecutor;
}
protected ScheduledExecutorService createExecutor(
			int poolSize, ThreadFactory threadFactory, RejectedExecutionHandler rejectedExecutionHandler) {

		return new ScheduledThreadPoolExecutor(poolSize, threadFactory, rejectedExecutionHandler);
}

ScheduledThreadPoolExecutor 类关系图:
在这里插入图片描述

public ScheduledThreadPoolExecutor(int corePoolSize,
                                       ThreadFactory threadFactory,
                                       RejectedExecutionHandler handler) {
        super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
              new DelayedWorkQueue(), threadFactory, handler);
    }

构造方法内仅调用了父类线程池类的构造方法进行初始化。

最后如果在 SSM 项目中想注入一个 ThreadPoolTaskScheduler 对象,在 xml 中配置
<task:scheduler id=“scheduler” pool-size=“10” /> 即可,pool-size 指定线程池的大小。

	<xsd:element name="scheduler">
		<xsd:annotation>
			<xsd:documentation><![CDATA[
	Defines a ThreadPoolTaskScheduler instance with configurable pool size. See Javadoc
	for the org.springframework.scheduling.annotation.EnableScheduling annotation for
	information on a code-based alternative to this XML element.
			]]></xsd:documentation>
		</xsd:annotation>
		<xsd:complexType>
			<xsd:attribute name="id" type="xsd:string" use="required">
				<xsd:annotation>
					<xsd:documentation><![CDATA[
	The bean name for the generated ThreadPoolTaskScheduler instance.
	It will also be used as the default thread name prefix.
					]]></xsd:documentation>
				</xsd:annotation>
			</xsd:attribute>
			<xsd:attribute name="pool-size" type="xsd:string" use="optional">
				<xsd:annotation>
					<xsd:documentation><![CDATA[
	The size of the ScheduledExecutorService's thread pool. The default is 1.
					]]></xsd:documentation>
				</xsd:annotation>
			</xsd:attribute>
		</xsd:complexType>
	</xsd:element>
ThreadPoolTaskScheduler实现动态管理定时任务 最近,有个项目有需要用到定时任务,所以做了一个动态管理定时任务的模块。本文将从项目背景、需求、选型、思路、具体实现等方面展开介绍。 背景:有个支付类的项目,中间会产生一些中间态的订单,需要有个定时任务轮询确认订单状态。该类项目体量较小,单节点部署,客户比较多,需要简单快速的部署、维护。 需求:定时任务能够通过表达式灵活指定执行计划,并支持动态启动、关闭、修改。定时任务模块最好和业务包在一个jar包内,部署简单。 选型:说到定时任务,当下最... 阅读详情

相关推荐

Spring Boot中使用ThreadPoolTaskScheduler实现轻量级多线程定时任务

我们可以轻松地在Spring Boot应用中实现轻量级的多线程定时任务。在处理定时任务中的异常情况时,确保系统稳定性的关键在于正确地捕获和处理这些异常。例如,如果一个任务因为网络问题失败,可能在稍后重试时会成功。通过实施上述策略,可以显著提高定时任务的稳定性和可靠性,确保系统在面对异常情况时能够保持稳定运行。对于关键任务,可以考虑将任务持久化到数据库中,以便在系统崩溃后能够重新启动任务。如果可能,隔离可能导致异常的任务,以防止它们影响其他任务。实现监控机制,当任务失败时触发报警,以便及时响应。

心猿意码 1827

在 SpringBoot 中使用 ThreadPoolTaskScheduler 实现定时任务

在 SpringBoot 中使用 ThreadPoolTaskScheduler 来实现定时任务。

Wayfreem的博客 2万+

VC Spyglass实战指南:从零开始掌握CDC约束配置与调试

本文详细介绍了如何使用VC Spyglass进行CDC约束配置与调试,从基础环境搭建到典型CDC问题调试实战,帮助开发者快速掌握跨时钟域验证技术。通过TCL脚本和SDC约束的深度解析,提升CDC验证效率,避免常见设计风险。

weixin_26757925的博客 298

ThreadPoolTaskScheduler和ThreadPoolTaskExecutor

ThreadPoolTaskScheduler和ThreadPoolTaskExecutor是Spring框架中用于任务调度和线程池管理的类。ThreadPoolTaskScheduler主要用于任务调度,按照时间间隔或Cron表达式执行任务。ThreadPoolTaskExecutor主要用于线程池管理,执行异步任务和多线程任务。

qq_41067796的博客 3180

CMOS图像传感器系列--(四)HDR之LOFIC技术

CMOS图像传感器HDR技术之LOFIC解析 LOFIC(横向溢出积分电容器)技术是当前高动态范围成像的重要方案,通过在像素光电二极管旁设置高密度电容器收集溢出电荷,有效保留高光细节。该技术采用特殊像素结构,通过skim level触发电荷转移,实现单帧HDR成像。然而LOFIC存在显著局限性:高光区域噪声明显且难以消除,动态范围拓展不均衡(主要优化亮部),需复杂MIM工艺导致成本升高。为应对挑战,行业提出混合方案(如结合DCG技术)和工艺改进方向。OmniVision最新车载传感器OX08D10就采用了L

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 5808

地图可视化类型大全

地图可视化类型大全: 散点地图 网格地图 聚合地图 气泡地图 热力图 Choropleth地图/分级设色地图/分级区域地图/着色地图/分级统计地图(百度百科这样翻译)/等值域地图/分段设色地图 Cartogram地图/变形地图/示意地图 规则形状地图 /RecMap/Demers Cartogram/瓷砖网格地图/DorlingMap 流型图(Flow Map)\流线图\流向图\轨迹地图 复合地图

codeuniverse的博客 3534

【多线程编程】--任务调度类ThreadPoolTaskScheduler、ScheduledThreadPoolExecutor解析

springboot的常见的任务调度这篇文章介绍了一些常见的任务调度技术方法。接下来,将会对ThreadPoolTaskScheduler、ScheduledThreadPoolExecutor进行对比。通过简单使用、源码实现、优缺点等来分析,以便在各种应用场景上使用相应技术。下面介绍的技术主要是针对 非分布式环境下可以考虑采用。ScheduledThreadPoolExecutor适用场景:主要是延迟一次性任务、周期性任务;

寻梦友的博客 3125

24GHz雷达DIY呼吸监测仪:用树莓派+TI IWR6843搭建生命体征检测系统(附Python代码)

本文详细介绍了如何利用树莓派和TI IWR6843毫米波雷达模块DIY非接触式呼吸监测仪。通过硬件选型、信号处理流水线设计和实时可视化系统搭建,实现高精度的生命体征检测,特别适合医疗健康和运动监测场景。附带的Python代码帮助开发者快速复现该系统。

rl6adventurer的博客 986

定时器中ThreadPoolTaskScheduler的使用

文章目录前言一、为什么使用ThreadPoolTaskScheduler?二、使用步骤1.启动类2.编写定时任务配置类3.编写工具类实现定时任务的增删改查。 前言 最近业务上有个需求是将当天的直播进行录制,这里录制技术我们不做过多研究,主要使用的是ffmpeg,有兴趣的可以下来去研究研究。其中的录制要求有两点。一是能够在录制中进行更改录制时间,二是能够实现周期录制。个人对上述的要求在业务上采用了定时器来进行实现。主要使用的是ThreadPoolTaskScheduler。 一、为什么使用ThreadPo

weixin_43144460的博客 7094

二、基于C语言的JPEG解码代码详解

// JPEG解码 // 输入JPEG后输出Bitmap #include <stdio.h> #include <stdlib.h> #pragma warning(disable : 4996) unsigned int BuffIndex; // JPEG数据的位置 unsigned int BuffSize; // JPEG数据的大小 unsigned int BuffX; // 图像的横向尺寸 unsigned int BuffY; //

m0_37633745的博客 4458

OC5021B 100V宽电压输入 LED车灯/大功率照明 DC降压型恒流驱动器

适用于LED大功率汽车大灯/大功率照明 OC5021B 100V宽电压输入 5A电流设计 DC-DC降压型恒流驱动IC

Handsome63841990的博客 2420

使用ThreadPoolTaskScheduler实现可关闭的定时任务

按照执行时间启动指定时间间隔执行的定时任务,并在不需要时手动关闭。

weixin_49990593的博客 1975

【参数配置】OpenClaw 的破解之道(Doom Loop)

本文深入解析了OpenClaw中的Doom Loop(死循环)问题及其应对策略。主要内容包括: Agent Loop的核心概念:基于ReAct范式,OpenClaw通过"思考-行动-观察"循环执行任务,但可能陷入无进展的死循环。 Doom Loop现象:Agent持续执行但任务进度为零,常见于四种工具调用场景:相同调用重复执行、调用不存在工具、轮询工具卡死、操作交替振荡。 OpenClaw的防御机制: 第一道防线:重试端断路器,通过上下文压缩熔断(最多3次)和总重试次数熔断(32-160次)防止无限重试。

海兰 4042

ThreadPoolTaskScheduler自定义定时任务框架

之前用的@Sceduler定时框架,服务启动后就不能重新修改执行计划(或许有,我孤陋寡闻),后来换成这个,可以随时添加,删除,修改定时任务,配置修改发布,实时生效。

laolvbig的博客 2188

scratch经典游戏主题源码分享,包含了20多款经典游戏

经典游戏案例:1、360度角度射击游戏 2、捕鱼达人 3、超级马里奥 4、超级玛丽 5、吃豆人相关 6、穿着喷气背包的海龟 7、大鱼吃小鱼 8、俄罗斯方块 9、飞机大战 10、愤怒的小鸟 11、黄金矿工 12、节奏大师 13、连连看 14、迷宫游戏 15、跑酷游戏 16、扫雷 17、水果忍者 18、坦克大战 19、推箱子 20、消除泡泡 21、保卫萝卜 22、植物大战僵尸

IT_Scratch的博客 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

SpringBoot 中利用 ThreadPoolTaskScheduler 实现定时任务

ThreadPoolTaskScheduler 是Spring框架的一个强大的工具 ,它实现了TaskScheduler 接口,能够方便地用于调度的管理定时任务。最后,我们启动Spring Boot应用,并通过浏览器或Postman等工具访问提供的接口来测试定时任务的启动、停止和停止所有功能。为了测试定时任务的启动和停止,我们需要创建一个控制器类,提供启动、停止单个任务和停止所有任务的接口。类中,我们实现了定时任务的启动、停止和停止所有任务的核心逻辑。,观察控制台输出,所有任务的执行日志都应该停止。

weixin_43845483的博客 1747

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ThreadPoolTaskScheduler spring定时任务框架,线程池配置

参数配置,只能配置核心线程池参数大小 @Bean(name = "threadPoolTaskScheduler") public ThreadPoolTaskScheduler taskScheduler() { // Spring 默认配置是核心线程数大小为1,最大线程容量大小不受限制,队列容量也不受限制。 ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); //...

吻得太逼真的博客 6082

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

使用ThreadPoolTaskScheduler实现定时任务调度

本文介绍了在项目限制条件下使用ThreadPoolTaskScheduler实现定时任务调度的解决方案。通过配置类创建线程池,设置核心线程数、线程前缀、任务取消策略等参数,并采用CallerRunsPolicy拒绝策略确保任务执行可靠性。该方法在不引入额外框架的情况下,利用多线程机制实现了高效的定时任务调度功能,适用于框架受限的开发场景。

String_001的博客 894

ThreadPoolTaskScheduler 定时如何等待任务执行完毕结束

任务正在运行的过程中,我中断任务,那么这个任务是立刻被中断还是等待整个任务结束之后在进行中断。那么这个是根据我们任务的性质来确定。如何来进行实现,下面我们看代码:

datouniao1的博客 1282

SpringBoot+ThreadPoolTaskScheduler,定时任务还可以这么玩~

????这是一个或许对你有用的社群????一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:《项目实战(视频)》:从书中学,往事中“练”《互联网高频面试题》:面朝简历学习,春暖花开《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题《精进 Java 学习指南》:系统学习,互联网主流技术栈《必读 Java 源码专栏》:知其然,知其所以然????这是一个或许...

weixin_44421461的博客 923

Spring动态管理定时任务——ThreadPoolTaskScheduler

Spring任务调度核心类ThreadPoolTaskScheduler,API文档解释如下: Implementation of Spring's TaskScheduler interface, wrapping a native java.util.concurrent.ScheduledThreadPoolExecutor. Spring的TaskScheduler接口的实现,包装了...

天天向上 7062

Springboot使用ThreadPoolTaskScheduler轻量级多线程定时任务框架

Spring注解定时任务使用不是很灵活,如果想要灵活的配置定时任务,可以使用xxl-job 或者 quartz等定时任务框架,但是过于繁琐,可能成本较大。所以可以使用ThreadPoolTaskScheduler来灵活处理定时任务。

路漫漫其修远兮,吾将上下而求索 1730

ThreadPoolTaskScheduler的使用,定时任务开启与关闭

这里用的是Springboot框架。进行测试开发的,其实都是一样的。只不过这样比较方便测试。 利用定时线程池任务调度,多利模式, 定点查询任务,开启或关闭简单案例,如果任务有需求,那么就拼接cron表达式,传入定时任务即可。 /** * @author: Licl **/ @Component @Scope("prototype") public class DynamicTask ...

qq_1141193930的博客 5万+

动态定时任务ThreadPoolTaskScheduler

在工作中出现了这样一个需求,用户可以制定多个任务,每个任务可以定时分配给多个人。任务的属性包括:任务巡检周期、任务工作日历、巡检人员。这就需要我们开发一个动态的定时任务功能,而且这个定时任务是可以随时新增、更改、停止的。

Adyczb的博客 797

ThreadPoolTaskScheduler定时器

import java.util.HashMap; import java.util.Map; import java.util.concurrent.ScheduledFuture; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.Trigger; import org.springframework.scheduling.concurrent.ThreadPool

半城繁華半城傷的博客 2613
上一篇: SpringBoot内自动配置的线程池
下一篇: 使用 Jenkins 自动部署 SpringBoot 项目
阿拉灯神丁-Java
博客等级 码龄7年 6粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值