spring task使用
Spring Task 简介
Spring Task 是 Spring 框架原生自带的任务调度框架,它犹如一把瑞士军刀,为开发者提供了丰富多样的功能,助力轻松创建和管理定时任务。相较于其他一些第三方任务调度框架,Spring Task 最大的优势在于其与 Spring 生态系统的无缝集成。这意味着开发者能够在 Spring 应用中自如地运用依赖注入、事务管理等强大特性,使得代码的编写过程更加流畅,后期维护也更为便捷。例如,在一个电商系统中,我们可以利用 Spring Task 定时更新商品库存信息,同时借助依赖注入获取商品服务层的实例,实现业务逻辑的高效处理。
添加依赖
在非 Spring Boot 的 Spring 项目中,需要添加 spring-context 依赖:
Spring Boot 项目中无需添加依赖
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version>
</dependency>
开启定时任务
若要在 Spring 项目中启用定时任务功能,首要步骤是在配置类或主启动类上添加@EnableScheduling注解。
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;@Configuration
@EnableScheduling
public class AppConfig {// 配置类中的其他配置,如数据源配置、Bean的定义等
}
在上述代码中,AppConfig类通过添加@Configuration注解表明这是一个配置类,而@EnableScheduling注解则通知 Spring 容器开始扫描并注册所有带有定时任务注解的方法,为后续的定时任务执行做好准备。
基于 Spring Boot 主启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;@SpringBootApplication
@EnableScheduling
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
对于 Spring Boot 项目,在主启动类Application上添加@SpringBootApplication注解,它整合了@Configuration、@EnableAutoConfiguration和@ComponentScan等多个注解的功能,而@EnableScheduling注解的加入则开启了定时任务的支持。当应用启动时,Spring 容器会自动扫描整个项目,识别并注册符合条件的定时任务。
添加了这个注解后,Spring 容器就如同一个敏锐的观察者,会自动扫描并注册所有带有定时任务注解的方法,为后续定时任务的执行搭建好了舞台。
@Scheduled 注解实现定时任务
在 Spring Task 的工具库中,最常用的定时任务定义方式当属使用@Scheduled注解。我们只需将这个注解添加到想要定时执行的方法上,Spring 就会严格按照我们指定的规则,如同忠诚的守护者一般,在合适的时间点准时调用这个方法。
例如,创建一个简单的定时任务,每隔 5 秒输出一条日志,记录系统的运行状态,代码如下:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
public class SimpleTask {private static final Logger logger = LoggerFactory.getLogger(SimpleTask.class);@Scheduled(fixedRate = 5000)public void executeTask() {logger.info("定时任务执行了!当前时间为:{}", System.currentTimeMillis());}
}
在上述代码中,@Scheduled(fixedRate = 5000)表示这个方法会以固定的速率执行,每 5000 毫秒(即 5 秒)执行一次。每次任务执行时,都会在日志中记录下 “定时任务执行了!” 以及当前的时间戳,方便开发者追踪任务的执行情况。
执行策略
cron 表达式
cron表达式堪称任务执行时间定义的魔法咒语,它以一种极为灵活且强大的方式来精准控制任务的执行时间。它由 6 或 7 个空格分隔的时间字段组成,从左到右分别表示秒、分、时、日、月、周以及年(年字段为可选)。
例如,要在每天的凌晨 2 点整执行任务,对数据库进行日常备份,确保数据的完整性,配置如下:
@Scheduled(cron = "0 0 2 * * *")
public void dailyTask() {// 数据库备份逻辑,例如调用数据库备份工具或执行SQL语句
}
下面是一些常用的cron表达式示例,帮助开发者更好地理解和运用:
- 0 0 12 * *?:每天中午 12 点整执行,适用于在中午进行数据统计或报表生成的场景。
- 0 15 10 * *?:每天上午 10 点 15 分执行,可用于在工作时间开始时更新系统数据或发送通知。
- 0 0/5 * * *?:每隔 5 分钟执行一次,常用于实时数据监控或缓存更新的场景。
fixedDelay
fixedDelay表示上一次任务执行完毕后,间隔指定的时间再执行下一次任务。例如,设置fixedDelay = 3000,意味着上一次任务执行完成后,系统会耐心等待 3 秒,然后再启动下一次任务。这种策略适用于任务执行时间不固定,但希望每次执行之间有一定间隔的场景,比如在数据采集任务中,每次采集完成后,需要一定时间处理数据,处理完后再进行下一次采集。
@Scheduled(fixedDelay = 3000)
public void taskWithFixedDelay() {// 数据采集或其他任务执行逻辑
}
fixedRate
fixedRate表示按照固定的时间间隔执行任务,无论上一次任务是否执行完毕。例如,设置fixedRate = 5000,表示每隔 5 秒就会启动一次任务,如同一个精准的时钟,不管前一次任务的状态如何,都会按时触发下一次任务。这种策略适用于需要持续周期性执行的任务,比如定时向服务器发送心跳包以保持连接。
@Scheduled(fixedRate = 5000)
public void taskWithFixedRate() {// 发送心跳包或其他周期性任务执行逻辑
}
initialDelay
initialDelay用于指定在应用启动后,延迟多长时间再执行第一次任务。它通常与fixedRate或fixedDelay一起使用,为任务的首次执行提供了灵活的控制。
例如,应用启动后延迟 2 秒,然后每隔 5 秒执行一次任务,可用于在系统初始化完成后,再开始执行周期性任务。
@Scheduled(initialDelay = 2000, fixedRate = 5000)
public void taskWithInitialDelay() {// 系统初始化后的周期性任务执行逻辑
}
异步使用
在某些复杂的业务场景下,我们可能期望定时任务能够异步执行,避免阻塞主线程,确保系统的高并发性能和响应速度。Spring Task 充分考虑到了这一需求,提供了完善的异步执行支持。
首先,需要在配置类中启用异步任务支持,添加@EnableAsync注解:
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;@Configuration
@EnableScheduling
@EnableAsync
public class AppConfig {// 配置类中的其他配置,如线程池配置等
}
在上述代码中,@EnableAsync注解告诉 Spring 容器开启异步任务的功能,允许方法在独立的线程中执行。同时,我们还可以在配置类中进一步配置线程池的参数,如线程池的大小、最大线程数等,以优化异步任务的执行效率。
然后,在需要异步执行的定时任务方法所在的类上添加@Async注解:
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
@Async
public class AsyncTask {@Scheduled(fixedRate = 5000)public void asyncExecuteTask() {// 异步任务执行逻辑,例如调用远程服务或进行复杂计算}
}
当asyncExecuteTask方法被调用时,它会在一个单独的线程池中执行,如同在后台默默工作的助手,不会干扰主线程的正常运行,从而确保系统在处理定时任务的同时,能够高效地响应其他用户请求。
相关文章:
spring task使用
Spring Task 简介 Spring Task 是 Spring 框架原生自带的任务调度框架,它犹如一把瑞士军刀,为开发者提供了丰富多样的功能,助力轻松创建和管理定时任务。相较于其他一些第三方任务调度框架,Spring Task 最大的优势在于其与 Sprin…...
【FPGA】时序约束与分析
设计约束 设计约束所处环节: 约束输入 分析实现结果 设计优化 设计约束分类: 物理约束:I/O接口约束(例如引脚分配、电平标准设定等物理属性的约束)、布局约束、布线约束以及配置约束 时序约束:设计FP…...
LLM的MoE由什么构成:门控网络,专家网络
LLM的MoE由什么构成:门控网络,专家网络 目录 LLM的MoE由什么构成:门控网络,专家网络专家网络门控网络MoE在联邦学习中的使用及原理专家网络 定义与特点:是一组独立的模型,每个模型都负责处理某个特定的子任务或学习输入空间的特定部分。这些专家可以是简单的线性回归模型…...
HTML-多媒体标签
除了图像,网页还可以放置视频和音频。 1.<video> <video>标签是一个块级元素,用于放置视频。如果浏览器支持加载的视频格式,就会显示一个播放器,否则显示<video>内部的子元素。 <video src"example.…...
MySQL笔记大总结20250108
Day2 1.where (1)关系运算符 select * from info where id>1; select * from info where id1; select * from info where id>1; select * from info where id!1;(2)逻辑运算符 select * from info where name"吴佩奇" and age19; select * from info wh…...
stm32week3
stm32学习 二.外设 8.TIM输出比较 OC(output compare)输出比较 输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0、翻转操作,用于输出一定频率和占空比的PWM波形 每个高级定时器和通用定时器都拥有4个输出比较通道 高级定时器的…...
uniapp 的uni.getRecorderManager() 录音功能小记
官网上明确说的是全局唯一并且只是获取对象,所以会导致一个问题就是,当你多个页面要用到这个对象的时候,会发现 onStop 方法会被覆盖,导致调用结果不是自己想要的 解决办法也简单粗暴,在需要用到的界面重新覆盖onStop…...
【面试题】技术场景 4、负责项目时遇到的棘手问题及解决方法
工作经验一年以上程序员必问问题 面试题概述 问题为在负责项目时遇到的棘手问题及解决方法,主要考察开发经验与技术水平,回答不佳会影响面试印象。提供四个回答方向,准备其中一个方向即可。 1、设计模式应用方向 以登录为例,未…...
RT-DETR代码详解(官方pytorch版)——参数配置(1)
前言 RT-DETR虽然是DETR系列,但是它的代码结构和之前的DETR系列代码不一样。 它是通过很多的yaml文件进行参数配置,和之前在train.py的parser argparse.ArgumentParser()去配置所有参数不同,所以刚开始不熟悉代码的时候可能不知道在哪儿修…...
腾讯云AI代码助手编程挑战赛-凯撒密码解码编码器
作品简介 在CTFer选手比赛做crypto的题目时,一些题目需要自己去解密,但是解密的工具大部分在线上,而在比赛过程中大部分又是无网环境,所以根据要求做了这个工具 技术架构 python语言的tk库来完成的GUI页面设计,通过…...
搭建docker私有化仓库Harbor
Docker私有仓库概述 Docker私有仓库介绍 Docker私有仓库是个人、组织或企业内部用于存储和管理Docker镜像的存储库。Docker默认会有一个公共的仓库Docker Hub,而与Docker Hub不同,私有仓库是受限访问的,只有授权用户才能够上传、下载和管理其中的镜像。这种私有仓库可以部…...
【Vim Masterclass 笔记09】S06L22:Vim 核心操作训练之 —— 文本的搜索、查找与替换操作(第一部分)
文章目录 S06L22 Search, Find, and Replace - Part One1 从光标位置起,正向定位到当前行的首个字符 b2 从光标位置起,反向查找某个字符3 重复上一次字符查找操作4 定位到目标字符的前一个字符5 单字符查找与 Vim 命令的组合6 跨行查找某字符串7 Vim 的增…...
GIC中断分组介绍(IMX6ull为例)
一、Cortex-A7内核中断 Cortex-A7内核具有多个中断类型,但其中最重要的是复位中断和IRQ(普通中断请求)中断。对于IMX6ULL而言,主要关注的是IRQ中断,因为外部设备和内部事件通常都会触发这类中断。 从左到右 中断控制…...
计算机网络期末复习(知识点)
概念题 在实际复习之前,可以看一下这个视频将网络知识串一下,以便更好地复习:【你管这破玩意叫网络?】 网络规模的分类 PAN(个人区域网络):用于个人设备间的连接,如手机与蓝牙耳机…...
Apache XMLBeans 一个强大的 XML 数据处理框架
Apache XMLBeans 是一个用于处理 XML 数据的 Java 框架,它提供了一种方式将 XML Schema (XSD) 映射到 Java 类,从而使得开发者可以通过强类型化的 Java 对象来访问和操作 XML 文档。下面将以一个简单的案例说明如何使用 Apache XMLBeans 来解析、生成和验…...
飞凌嵌入式i.MX8M Mini核心板已支持Linux6.1
飞凌嵌入式FETMX8MM-C核心板现已支持Linux6.1系统,此次升级不仅使系统功能更加丰富,还通过全新BSP实现了内存性能的显著提升。 基于NXP i.MX8M Mini处理器设计开发的飞凌嵌入式FETMX8MM-C核心板,拥有4个Cortex-A53高性能核和1个Cortex-M4实时…...
【数据链电台】洛克希德·马丁(Lockheed Martin)
洛克希德马丁公司(Lockheed Martin)是全球领先的航空航天、国防、先进技术和安全领域的供应商之一。 公司为美军及盟国军队提供了广泛的通信系统,包括数据链电台和相关的通信系统。 洛克希德马丁的许多产品用于战术通信、卫星通信、电子战、…...
python关键字(保留字)用法、保留的标识符类(1)
python关键字(保留字)用法、保留的标识符类(1) 一、python保留字(关键字) 1.1、python关键字 以下标识符为保留字,或称 关键字,不可用于普通标识符,即我们不能把它们用作任何标识符名称。 python 保留字(关键字) 关键…...
Ubuntu平台虚拟机软件学习笔记
Ubuntu平台上常见虚拟机软件 VirtualBox [Download]KVM/QEMU 1. VirtualBox 1.1 查看安装版本 VBoxManage -V2. KVM/QEMU KVM: Kernel-based Virtual Machine QEMU: Quick EMUlator 通义千问: virt-manager 既不是QEMU也不是KVM,而是用于管理和创建…...
【数据库系统概论】数据库恢复技术
目录 11.1 事务的基本概念 事务的定义 事务的开始与结束 事务的ACID特性 破坏ACID特性的因素 11.2 数据库恢复概述 11.3 故障的种类 1. 事务内部的故障 2. 系统故障 3. 介质故障 4. 计算机病毒 11.4 恢复的实现技术 如何建立冗余数据 数据转储 登记日志文件 11…...
告别Keil4!手把手教你用Keil C51 V9.61编译51单片机代码(附最新激活方法)
51单片机开发效率革命:Keil C51 V9.61全栈升级指南 当你的51单片机项目编译进度条像蜗牛爬行时,当老旧开发环境频繁卡顿崩溃时,开发者们都在期待一场彻底的效率革命。Keil C51 V9.61的发布,正是针对这些痛点的技术回应——它不仅将…...
Ubuntu虚拟机磁盘空间耗尽导致MySQL启动失败的系统恢复与预防指南
1. 问题现象与核心原因剖析最近在折腾Ubuntu虚拟机时,遇到了一个挺典型的开机故障:系统启动时卡住,屏幕上赫然显示着“Failed to start MySQL Community Server”的错误信息,紧接着系统就停滞不前,无法进入图形界面。这…...
AArch64虚拟内存系统架构与64KB粒度地址转换详解
1. AArch64虚拟内存系统架构概述现代处理器架构通过虚拟内存机制实现物理内存与虚拟地址空间的隔离映射,AArch64作为ARMv8/ARMv9架构的64位执行状态,其虚拟内存系统架构(VMSA)采用多级页表机制实现地址转换。与传统x86架构相比&am…...
给硬件工程师的芯片FT测试入门:从ATE、Handler到Socket,一次搞懂所有‘治具’
芯片FT测试全流程实战指南:从设备选型到治具配置 第一次走进芯片测试车间时,我被眼前那些闪烁着信号灯的庞大设备和精密治具震撼到了。作为硬件工程师,我们可能更熟悉PCB设计和电路仿真,但当芯片进入量产阶段,如何确保…...
告别光流计算!用PyTorch复现MotionNet,5分钟搞定视频动作识别
5分钟实现视频动作识别:PyTorch版MotionNet实战指南 在咖啡还没凉透的间隙里,让AI看懂视频动作——这曾是计算机视觉领域最耗时的任务之一。传统双流网络需要预计算光流,像手工制作意大利面般繁琐;而2017年问世的MotionNet就像发…...
告别ActiveX!用WebSocket+JavaScript在Chrome/Firefox里直接调用扫描仪(附完整代码)
现代浏览器无插件扫描方案:WebSocket与JavaScript的完美结合 曾几何时,企业办公系统中扫描文档需要依赖特定的浏览器和插件。如今,随着技术演进,我们终于可以摆脱ActiveX和NPAPI的束缚,在Chrome、Firefox等现代浏览器中…...
MMAUD:面向现代微型无人机威胁的全面多模态反无人机数据集
摘要 https://arxiv.org/pdf/2402.03706 针对小型无人机(UAV)不断演变的挑战(其具备运输有害载荷或独立造成破坏的潜力),我们推出了 MMAUD:一个全面的多模态反无人机数据集。MMAUD 通过专注于无人机检测、无…...
从点击到意图:鸿蒙 App 的 AI 进化
子玥酱 (掘金 / 知乎 / CSDN / 简书 同名) 大家好,我是 子玥酱,一名长期深耕在一线的前端程序媛 👩💻。曾就职于多家知名互联网大厂,目前在某国企负责前端软件研发相关工作,主要聚…...
从Kafka设计哲学到高性能系统通用模式:吞吐、顺序I/O与批处理的艺术
1. 项目概述:为什么是Kafka?如果你在后台开发、数据平台或者中间件领域摸爬滚打过几年,大概率会听过甚至深度使用过Apache Kafka。它早已不是一个简单的消息队列,而是现代数据驱动架构的“中枢神经系统”。我最初接触Kafka&#x…...
Git忽略文件失效?一招解决!
场景: 在某次 Git 提交时,忘记在 .gitignore 文件中添加上某个原本应该被忽略的文件夹或者文件,于是后一次的提交时在 .gitignore 加上了这些文件,但是在远程的仓库中这些文件夹、文件却并没有消失。这个属于属于什么问题…...
