Spring Task 定时任务调度

一、概念

Spring Task 是 Spring 框架的一个组件,它为任务调度提供了支持,使得开发者能够创建后台任务或定期执行的任务。通过 Spring Task,您可以方便地在 Java 应用程序中实现定时任务,比如每天凌晨进行数据同步、每小时执行一次清理操作等。

二、使用

1 、配置类启用定时任务支持

启动类(也可以是其他Controller等运行程序的类)添加@EnableScheduling注解,,以开启基于注解的任务调度器,自动扫描 @Scheduled

2、 同步定时任务

创建一个服务类或组件,在其中的方法上使用 @Scheduled 注解来定义定时任务。

 

package com.yy.springtask;import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
@Slf4j
public class ScheduledTask {//上一次开始执行时间和下次开始时间间隔5s@Scheduled(fixedRate = 5000)public void fixedRateTask() {log.debug("fixedRateTask");}//上次结束到下次开始执行时间间隔5s@Scheduled(fixedDelay = 5000)public void fixedDelayTask() {log.debug("fixedDelayTask");}//第一次延迟6秒后执行,然后每2s循环执行// @Scheduled(initialDelay = 6000,fixedDelay = 2000)public void initialDelayTask() throws InterruptedException {log.debug("initialDelayTask");}//使用corn表达式每5s执行一次// @Scheduled(cron = "0/5 * * * * ?")public void cron() {log.debug("cronTask执行");}}

在 Spring Task 中,当我们使用 @Scheduled 注解来定义定时任务时,默认会使用一个单线程的 ScheduledTaskExecutor 来按顺序执行这些任务。这意味着,如果不自定义线程池配置,那么多个定时任务将会按照它们被触发的顺序依次执行,而不是并行执行。

若要改变这种行为,使得定时任务能够并发执行,可以通过配置 ThreadPoolTaskSchedulerThreadPoolTaskExecutor 来创建一个拥有多个工作线程的线程池。这样,不同的定时任务就可以在各自独立的线程中同时运行,提高系统整体的处理效率。

3、异步定时任务

 由于定义的定时任务是单线程的,我们可以开启异步定时任务,开启多个任务线程

1.开启异步支持: 要在 Spring Boot 应用中启用异步方法调用,需在启动类上添加 @EnableAsync 注解。

2.定义异步方法: 在服务类中定义一个方法,并使用 @Async 注解标记它以实现异步执行:

 默认情况下,Spring Boot 会配置一个简单的异步任务执行器。但你可能需要调整其配置,如核心线程数、队列容量、最大线程数等. 例如:

application.properties

spring.application.name=xxl_job#日志配置
logging.level.root=error
logging.level.com.yy = debug# Spring Task 调度线程池大小,默认为 1,建议根据任务量进行调整。
# 如果不开启异步,可以理解为工厂经理们亲自处理任务
spring.task.scheduling.thread-name-prefix = jingli-
spring.task.scheduling.pool.size = 1
#当开启异步后,@EnableAsync 经理就不再干活了,而是工人干,经理只负责调度,管理# 配置工人,调度线程名称前缀
spring.task.execution.thread-name-prefix = worker-
# 任务执行线程池配置,核心线程池大小,默认为 8,长工2个
spring.task.execution.pool.core-size= 2
# 最大线程池大小,可以根据实际情况调整,临时工+长工最多为6个
spring.task.execution.pool.max-size= 6
# 线程空闲时间(超时时间),超过这个时间没有任务则关闭线程,单位秒
spring.task.execution.pool.keep-alive= 60s
# 队列容量,用于存放等待执行的任务,如果不指定,int.max
spring.task.execution.pool.queue-capacity= 2
# 拒绝策略,当线程池和队列都满时如何处理新提交的任务,可选值有 AbortPolicy, CallerRunsPolicy 等
spring.task.execution.pool.rejection-policy= CallerRunsPolicy

或者使用yml配置文件

# Spring Task 调度线程池大小,默认为 1,建议根据任务量进行调整。
# 如果不开启异步,可以理解为工厂经理们亲自处理任务
spring:task:scheduling:pool:size: 10# 调度线程名称前缀,默认为 "scheduling-"thread-name-prefix: scheduling-# 任务执行线程池配置execution:pool:# 核心线程池大小,默认为 8core-size: 8# 最大线程池大小,可以根据实际情况调整max-size: 10# 线程空闲时间(超时时间),超过这个时间没有任务则关闭线程,单位秒keep-alive: 60s# 队列容量,用于存放等待执行的任务,如果不指定,int.maxqueue-capacity: 50# 拒绝策略,当线程池和队列都满时如何处理新提交的任务,可选值有 AbortPolicy, CallerRunsPolicy 等rejection-policy: CallerRunsPolicyspring.task.scheduling.pool 和 spring.task.exec

spring.task.scheduling.pool 和 spring.task.execution.pool 区别:

在 Spring Boot 中,spring.task.scheduling.poolspring.task.execution.pool 分别对应着两种不同的线程池配置,分别服务于不同的目的:

spring.task.scheduling.pool: 这个配置是针对 Spring Task 的定时任务调度器 ThreadPoolTaskScheduler。当应用中使用 @Scheduled 注解来定义和执行定时任务时,这个线程池负责调度和执行这些定时任务。配置这个线程池的大小(如 size 属性),意味着你可以控制并发执行定时任务的线程数量,以此来优化系统资源利用,特别是在有多项定时任务需要并行执行时。

spring.task.execution.pool: 这个配置是针对 Spring 异步任务执行器 ThreadPoolTaskExecutor。当应用中使用 @Async 注解来标记某个方法以异步方式执行时,这个线程池会被用来执行那些被异步调用的方法。配置这个线程池的核心线程数(core-size)、最大线程数(max-size)以及线程空闲存活时间(keep-alive)等属性,可以帮助你管理和控制异步任务执行时的并发级别和资源利用率。

总结来说,spring.task.scheduling.pool 主要是用于管理定时任务的并发执行,而 spring.task.execution.pool 则是处理程序中通过异步注解触发的非定时异步任务的并发执行。两者都是为了提高系统处理能力和响应速度,但是应用场景有所不同。

 三、 Api说明

1. fixedDelay :上次结束到下次开始执行时间间隔:

@Scheduled(fixedDelay = 4000) 

 

2. fixedRate:上一次开始执行时间和下次开始时间间隔10s(必须开启一步才会按原计划执行)。如:

@Scheduled(fixedRate = 10000) 

 

3. initialDelay:第一次延迟多长时间后再执行。

@Scheduled(initialDelay=1000, fixedRate=5000) //第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次

 4. cron

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/819440.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用React.js从头开始构建TODO应用

如果你是React.js的新手,并且渴望投身应用程序开发,那么你来对地方了! 跟着我一起通过这个教程,从头开始构建一个基本的TODO应用程序。 (本文视频讲解:java567.com) TODO应用对初学者的重要性…

webSocket + springboot+vue3用法

领导安排个任务&#xff0c;大屏显示数据&#xff0c;要与后台数据一致&#xff0c;所以用到了websocket&#xff0c;涉及的前后端代码整理如下&#xff0c;希望对大家有所帮助。 后端代码 pom文件添加依赖 <!--websocket依赖--> <dependency><groupId>or…

jeecg-boot安装

我看大家都挺关注&#xff0c;所以集中上传了下代码和相关工具&#xff0c;方便大家快速完成 链接&#xff1a;https://pan.baidu.com/s/1-Y9yHVZ-4DQFDjPBWUk4-A 提取码&#xff1a;op1r 1. 下载代码 下载地址 : JEECG官方网站 - 基于BPM的低代码开发平台(低代码平台_零代…

C# 窗体应用程序 Chart控件显示实时曲线

IDE: VS2019 项目模板&#xff1a;C# windows 窗体应用(.NET Framework) 【参考】 B站上教程C#Chart控件画折线图的使用&#xff0c;关于Chart控件的属性&#xff0c;介绍得非常详细。B站上教程C#上位机Chart控件实时曲线终极讲解&#xff0c;对鼠标滚轮事件等&#xff0c;多个…

冯诺依曼结构理解

冯诺依曼结构 存储器&#xff1a;内存 数据是要在计算机的体系结构中进行流动的&#xff0c;在流动过程中对数据加工处理 从一个设备到另一个设备&#xff0c;本质是一种拷贝 CPU的计算速度是很快的&#xff0c;所以数据设备间的拷贝效率&#xff0c;决定了计算机整体的基本效率…

常见Spring相关工具报错-源码分析

常见Spring相关工具报错-源码分析 1. Resouce Bundle 国际化 yml 配置不生效 1. Resouce Bundle 国际化 yml 配置不生效 1️⃣ 配置yml 2️⃣ 报错信息 2024-04-15 15:13:57.828 [http-nio-8090-exec-1] WARN o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - [doResolveHan…

Python数据挖掘项目开发实战:使用朴素贝叶斯进行社会媒体挖掘

注意&#xff1a;本文下载的资源&#xff0c;与以下文章的思路有相同点&#xff0c;也有不同点&#xff0c;最终目标只是让读者从多维度去熟练掌握本知识点。 Python数据挖掘项目开发实战&#xff1a;使用朴素贝叶斯进行社会媒体挖掘 一、项目背景与目标 在社交媒体时代&…

Spring Boot | SpringBoot对 “SpringMVC“的 “整合支持“、SpringMVC“功能拓展实现“

目录: SpringMVC 的 “整合支持” ( 引入"Web依赖启动器"&#xff0c;几乎可以在无任何额外的配置的情况下进行"Web开发")1.SpringMVC "自动配置" 介绍 ( 引入Web依赖启动器"后&#xff0c;SpringBoot会自动进行一些“自动配置”&#xff0…

51单片机-LED模块

文章目录 1.点亮一个LED灯2.LED闪烁3.LED流水灯 1.点亮一个LED灯 #include <REGX52.H> void main() {P20xFE; //1111 1110while(1){} }2.LED闪烁 增加延时&#xff0c;控制LED的亮灭间隙 延时函数的添加依靠STC-ISP软件的延时函数功能代码自动生成&#xff0c;如图 #i…

Linux 使用C语言来加载和卸载内核模块

文章目录 一、insmod/rmmod1.1 insmod1.2 rmmod 二、C语言示例2.1 syscall2.2 dmeo 一、insmod/rmmod 1.1 insmod Linux 使用insmod来加载内核模块&#xff1a; NAMEinsmod - Simple program to insert a module into the Linux Kernel使用strace来追踪其过程&#xff1a; …

React中useEffect与useLayoutEffect有什么区别?

React中useEffect与useLayoutEffect有什么区别&#xff1f; 1. useEffect2. useLayoutEffect3. useEffect与useLayoutEffect的区别3.1 何时使用useLayoutEffect&#xff1f; 在React中&#xff0c;useEffect和useLayoutEffect都是用来处理副作用的Hook&#xff0c;例如数据获取…

童话里都是骗人的,靠可视化大屏升职加薪,除非老板脑子秀逗了。

可视化大屏有没有价值&#xff0c;肯定是有的&#xff0c;靠着可视化大屏升职加薪靠谱吗&#xff1f;不靠谱。 童话故事中的情节和元素往往是夸张和不现实的&#xff0c;不能完全应用于现实生活中。在现实世界中&#xff0c;升职加薪通常需要通过实际的工作表现、专业技能的提…

数据库练习(一)

完成以下SQL语句的编写&#xff1a; student表: score 表&#xff1a; 查询student表的所有记录 Select * from student; 查询student表的第2条到4条记录 select * from student LIMIT 1,3; 从student表查询所有学生的学号&#xff08;id&#xff09;、姓名&#xff08;n…

Java虚拟机——内存的分配详解

内存区域划分 对于大多数的程序员来说&#xff0c;Java 内存比较流行的说法便是堆和栈&#xff0c;这其实是非常粗略的一种划分&#xff0c;这种划分的“堆”对应内存模型的 Java 堆&#xff0c;“栈”是指虚拟机栈&#xff0c;然而 Java 内存模型远比这更复杂&#xff0c;想深…

react结合Redux实现全局状态管理

React与Redux结合使用&#xff0c;可以为React应用提供集中式的状态管理和复杂的业务逻辑处理能力。以下是React中使用Redux的基本步骤和关键概念&#xff1a; 安装所需库 确保已经安装了React和ReactDOM。然后安装Redux及其配套库&#xff1a; npm install redux react-redu…

基于云端部署,支持超大规模会议的召开,同时实现就近接入的功能

随着信息技术的飞速发展&#xff0c;云视频产品已成为企业沟通协作的重要工具。中国联通作为通信行业的领军企业&#xff0c;其云视频产品凭借多项技术优势&#xff0c;在市场中脱颖而出&#xff0c;成为众多企业的首选。 中国联通的云视频产品采用了先进的互联网高清技术&…

【计算机毕业设计】游戏售卖网站——后附源码

&#x1f389;**欢迎来到琛哥的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 琛哥&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 琛哥在深度学习任务中展现出卓越的能力&a…

数据结构和算法(哈希表和图(A*算法精讲))

一 、哈希表 1.1 哈希表原理精讲 哈希表-散列表&#xff0c;它是基于快速存取的角度设计的&#xff0c;也是一种典型的“空间换时间”的做法 键(key)&#xff1a; 组员的编号如&#xff0c;1、5、19。。。 值(value)&#xff1a; 组员的其它信息&#xff08;包含性别、年龄和…

Python-VBA函数之旅-divmod函数

目录 1、divmod函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、相关文章&#xff1a; 个人主页&#xff1a;非风V非雨-CSDN博客 divmod函数在Python中具有广泛的应用场景&#xff0c;特别是在需要同时处理除法的商和余数的情况下。常见的应用场景有&a…

《系统架构设计师教程(第2版)》第9章-软件可靠性基础知识-04-软件可靠性设计

文章目录 1. 容错设计技术1.1 恢复块设计1.2 N版本程序设计1.3 冗余设计 2. 检错技术3. 降低复杂度设计4. 系统配置中的容错技术4.1 双机热备技术4.1.1 双机热备模式4.1.2 双机互备模式4.1.3 双机双工 4.2 服务器集群技术 1. 容错设计技术 1.1 恢复块设计 恢复块设计 选择一组…