揭开 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万+

RK3588视频转码实战:如何用FFmpeg+MPP实现16路1080P硬解压(附完整命令)

本文详细介绍了如何在RK3588处理器上使用FFmpeg和MPP框架实现16路1080P视频的硬件加速转码。通过解析RK3588的视频处理架构、环境搭建步骤和实战配置,提供了完整的命令示例和性能调优建议,帮助开发者高效处理多路视频转码任务。

weixin_29233333的博客 556

ThreadPoolTaskScheduler和ThreadPoolTaskExecutor

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

qq_41067796的博客 3180

数据分析:美团大赛的具体案例制作

在数据集中,存在三个变量的经纬度数据,分别是商家的经纬度数据('sender_lng', 'sender_lat'),顾客的经纬度数据('recipient_lng', 'recipient_lat')和骑手的经纬度数据('grab_lng', 'grab_lat')。根据结果可知,平台订单创建时间的中位数为2022-10-21 02:59:01,平台订单创建时间的众数为2022-10-19 03:29:41、2022-10-23 03:29:47,与直方图相符。接下来,我们对是否为预定订单变量进行分析。

m0_68269346的博客 2501

禾赛XT16 vs XT32激光雷达实测对比:选16线还是32线?看完这篇不纠结

本文深度评测禾赛XT16与XT32激光雷达的性能差异与应用选择。通过实测数据对比,分析16线与32线激光雷达在点云密度、动态场景适应性及与IMU协同工作等方面的表现,帮助用户根据自动驾驶、机器人等不同应用场景做出最优选型决策。

table的专栏 945

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

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

寻梦友的博客 3125

吃透Chisel语言.02.Chisel+VS Code+Ubuntu/WSL2开发环境搭建与使用

既然是学Chisel语言,那肯定得先把环境配置好,磨刀不误砍柴工嘛。而且有个测试环境的话,在后期的学习过程中自己去试运行代码段可以加深学习效果。这里推荐使用Ubuntu或者基于WSL2(Windows Subsystem Linux 2)的Ubuntu,本人使用的是WSL2上的Ubuntu 20.04.3 LTS,在使用体验上与Ubuntu几乎没有区别,且能同时使用Windows提供的诸多便利。...

github-3rr0r的博客 8448

定时器中ThreadPoolTaskScheduler的使用

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

weixin_43144460的博客 7094

【原理图PCB专题】Allegro模块化移动器件报...has the LOCKED property怎么解锁?

正常来说做好一个模块化,如果不需要再动,最好还是lock,防止不明白的工程师异动导致问题。如果复用布局设计时,因为有些器件和拓扑并不完全一致,那需要调整部分器件,被锁之后只能全选,无法修改。所以解开锁定后,就能正常编辑了。

一点硬件 2393

从地方政府网站抓取政务公开数据:Python爬虫技术详解

在本文中,我们通过具体实例介绍了如何使用Python编写爬虫,从地方政府门户网站抓取政务公开数据。我们使用了requestsSelenium等最新技术,结合SQLite数据库存储抓取的数据,最后使用matplotlib进行数据可视化分析。通过本项目,您可以掌握如何抓取政府网站的公开数据,并将其进行清洗、存储和分析。这些技术对于进行政府政策分析、公共服务分析等方面具有重要的实际意义。希望通过本文的介绍,您能够更好地理解政务数据抓取的流程和方法,并能在实际工作中运用这些技术进行数据采集和分析。

2201_76125261的博客 1704

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

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

weixin_49990593的博客 1975

Android功耗系列专题理论之二十一:Power Monitor测功耗详细说明和注意事项

本文详细介绍了PowerMonitor手机功耗测试仪的功能与使用方法。该设备通过硬件连接替代手机电池,实时监测电流、电压等参数,适用于研发测试、软件优化等场景。文章包含设备接线说明(电源、USB、手机供电等接口)、驱动安装步骤及常见问题排查,并详细讲解了功耗测量操作流程,包括电压设置、开机步骤、数据采集与导出方法。特别强调了测量注意事项,如固定屏幕亮度、关闭后台应用、确保稳定连接等,以确保测试数据准确性。最后提供了简易测量步骤和详细测量流程指导。

602

ThreadPoolTaskScheduler自定义定时任务框架

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

laolvbig的博客 2188

重回童年的经典系列☀️| 【坦克大战3D版】游戏制作+解析

带你重回童年的经典系列——坦克大战3D版制作,感兴趣的可以看看呀~

努力前行,总会成为自己心中的那道光 5万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SpringBoot 中利用 ThreadPoolTaskScheduler 实现定时任务

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

weixin_43845483的博客 1747

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

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

吻得太逼真的博客 6082

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

使用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、付费专栏及课程。

余额充值