Spring Boot 创建定时任务
在现代应用程序开发中,定时任务是一个常见的需求。Spring Boot作为一个强大的框架,提供了简单易用的定时任务调度功能。本文将详细介绍如何在Spring Boot中创建和管理定时任务,并提供完整的代码示例。
1. 什么是定时任务
定时任务是指在预定的时间间隔或特定的时间点自动执行的任务。它们常用于执行周期性的数据备份、发送通知、数据清理等操作。
常见的定时任务使用场景
-
数据备份
-
日志清理
-
发送定时通知
-
定时数据同步
-
定期生成报表
2. Spring Boot中定时任务的基础知识
Spring Boot通过Spring Framework提供的@Scheduled注解,简化了定时任务的创建和管理。@Scheduled注解可以应用于任何无参方法,并支持多种类型的时间表达式。
@Scheduled注解的常用属性
-
fixedRate: 以固定的时间间隔执行任务,单位为毫秒。
-
fixedDelay: 在任务完成后的固定时间间隔执行下一次任务,单位为毫秒。
-
cron: 使用Cron表达式指定任务的执行时间。
3. 使用Spring Boot创建简单的定时任务
在Spring Boot中创建定时任务非常简单,只需以下几个步骤:
-
添加Spring Boot Starter依赖。
-
启用定时任务支持。
-
编写定时任务方法并使用@Scheduled注解。
1. 添加Spring Boot Starter依赖
在pom.xml文件中添加spring-boot-starter依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId>
</dependency>
2. 启用定时任务支持
在主应用程序类上添加@EnableScheduling注解,以启用定时任务的支持:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;@SpringBootApplication
@EnableScheduling
public class ScheduledTasksApplication {public static void main(String[] args) {SpringApplication.run(ScheduledTasksApplication.class, args);}
}
3. 编写定时任务方法并使用@Scheduled注解
创建一个新的服务类,在其中编写定时任务方法,并使用@Scheduled注解指定任务的执行时间:
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
public class ScheduledTasks {@Scheduled(fixedRate = 5000)public void reportCurrentTime() {System.out.println("Current Time: " + System.currentTimeMillis());}
}
上面的代码示例中,reportCurrentTime方法每隔5秒执行一次。
4. 定时任务示例代码
下面是一个更完整的定时任务代码示例,包括不同类型的定时任务:
示例1:使用固定间隔执行任务
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
public class FixedRateTask {@Scheduled(fixedRate = 10000)public void performTask() {System.out.println("Fixed rate task executed at " + System.currentTimeMillis());}
}
示例2:使用固定延迟执行任务
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
public class FixedDelayTask {@Scheduled(fixedDelay = 15000)public void performDelayedTask() {System.out.println("Fixed delay task executed at " + System.currentTimeMillis());}
}
示例3:使用Cron表达式执行任务
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
public class CronTask {@Scheduled(cron = "0 0/2 * * * ?")public void performCronTask() {System.out.println("Cron task executed at " + System.currentTimeMillis());}
}
上述代码示例中,performCronTask方法每两分钟执行一次。
5. 高级定时任务管理
在实际应用中,我们可能需要更复杂的定时任务管理功能,例如动态修改任务的执行时间、任务状态监控等。为此,我们可以借助Spring的TaskScheduler接口和ScheduledFuture对象。
动态修改任务执行时间
以下是一个示例,演示如何动态修改定时任务的执行时间:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import java.util.concurrent.ScheduledFuture;@Component
public class DynamicScheduledTask {@Autowiredprivate TaskScheduler taskScheduler;private ScheduledFuture<?> scheduledFuture;@PostConstructpublic void scheduleTask() {scheduledFuture = taskScheduler.scheduleAtFixedRate(this::performTask, 5000);}public void changeTaskInterval(long interval) {if (scheduledFuture != null) {scheduledFuture.cancel(false);}scheduledFuture = taskScheduler.scheduleAtFixedRate(this::performTask, interval);}private void performTask() {System.out.println("Dynamic scheduled task executed at " + System.currentTimeMillis());}
}
任务状态监控
我们可以通过ScheduledFuture对象来监控任务的状态,例如取消任务、检查任务是否完成等。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import java.util.concurrent.ScheduledFuture;@Component
public class MonitoredScheduledTask {@Autowiredprivate TaskScheduler taskScheduler;private ScheduledFuture<?> scheduledFuture;@PostConstructpublic void scheduleTask() {scheduledFuture = taskScheduler.scheduleAtFixedRate(this::performTask, 10000);}public void cancelTask() {if (scheduledFuture != null) {scheduledFuture.cancel(false);}}private void performTask() {System.out.println("Monitored scheduled task executed at " + System.currentTimeMillis());}
}
6. 总结
通过本文的介绍和示例代码,我们了解了如何在Spring Boot中创建和管理定时任务。Spring Boot的@Scheduled注解和TaskScheduler接口为定时任务提供了强大的支持,使得开发者能够轻松实现各种定时任务的需求。无论是简单的固定间隔任务,还是复杂的Cron表达式任务,Spring Boot都能提供简洁优雅的解决方案。
相关文章:
Spring Boot 创建定时任务
在现代应用程序开发中,定时任务是一个常见的需求。Spring Boot作为一个强大的框架,提供了简单易用的定时任务调度功能。本文将详细介绍如何在Spring Boot中创建和管理定时任务,并提供完整的代码示例。 1. 什么是定时任务 定时任务是指在预定…...
Vue使用Echarts(入门级)
最终效果: npm install echarts --save // 先安装echarts<template><!-- 创建一个dom区域用于挂载echarts图表 --><div id"chart" style"width: 600px;height:500px;"/> </template> <script> import * as ech…...
2025届秋招提前批信息汇总(计算机类)
私企篇 深信服 链接:https://app.mokahr.com/campus_apply/sangfor/27944#/home内推码:NTAHRFS截止时间:6月21日 TP-LINK 链接:https://hr.tp-link.com.cn/jobList?jobId107&jobDirection0&workPlace0¤tPa…...
Scala Collection(集合)
Scala Collection(集合) Scala集合库是Scala语言的核心特性之一,它提供了一套丰富的数据结构来存储、管理和操作数据。Scala集合分为可变(mutable)和不可变(immutable)两种类型,每种类型都有其特定的用途和优势。本文将详细介绍Scala集合库的基本概念、常用集合类型以及…...
Go 语言 UUID 库 google/uuid 源码解析:UUID version4 的实现
google/uuid 库地址 本文将解析 googl/uuid 库中 UUID 变体10版本4的实现。 版本 4 的 UUID 采取完全随机的方式实现,简单来说就是将 UUID 中的 122 位全部随机填充(剩余的 6 位作标记位)。版本 4 的 UUID 存在一定的重复风险,但…...
开发个人Go-ChatGPT--6 OpenUI
开发个人Go-ChatGPT–6 OpenUI Open-webui Open WebUI 是一种可扩展、功能丰富且用户友好的自托管 WebUI,旨在完全离线运行。它支持各种 LLM 运行器,包括 Ollama 和 OpenAI 兼容的 API。 功能 由于总所周知的原由,OpenAI 的接口需要密钥才…...
Spring中的工厂模式详解及应用示例
1. Spring中的BeanFactory BeanFactory是一个接口,表示它是一个工厂,负责生产和管理bean。在Spring中,BeanFactory是IOC容器的核心接口,定义了管理Bean的通用方法,如 getBean 和 containsBean。 BeanFactory与IOC容器…...
Electron 简单搭建项目
准备工作 全局安装 node npm创建文件夹,并执行 npm init安装 electron npm i electron --save-dev在 package.json 配置文件中的scripts字段下增加一条start命令: {"scripts": {"start": "electron ."} }由于配置中的入…...
旗晟智能巡检机器人:开启工业运维的智能化新篇章
在当今快速发展的工业领域,安全、效率和成本控制是企业运营的核心。旗晟科技以创新为驱动,推出了一站式的工业级智能巡检机器人数字化全景运维解决方案,为石油、天然气、化工、电力等高危行业提供了一个全新的运维模式。 一、面对挑战&#x…...
vue3的常用 Composition API有哪些?
Vue.js 3.0 引入了 Composition API,作为一种新的组织组件逻辑的方式,相比于传统的 Options API,Composition API 提供了更灵活、更可复用的代码组织方式。 以下是 Vue 3.0 中常用的 Composition API:setup() 函数: s…...
深度优先算法-DFS(算法篇)
算法之深度优先算法 深度优先算法(DFS) 概念: 深度优先算法(DFS)跟BFS算法一样是用于遍历图的算法,但是DFS并不像BFS算法一样,它搜索出来的路径不具有最短性,并且dfs算法类似于枚举,因此DFS算法一般用于求出问题的所…...
C++模块化之内部类
目录 1.引言 2.内部类的访问控制 3.优缺点分析 4.实际运用 4.1.实现复杂数据结构 4.2.封装细节实现 4.3.事件处理和回调 4.4.模板元编程辅助类 4.5. 访问控制和封装 4.6. 代码组织和模块化 5.总结 1.引言 在C中,内部类(Nested Classÿ…...
k8s-第九节-命名空间
命名空间 如果一个集群中部署了多个应用,所有应用都在一起,就不太好管理,也可以导致名字冲突等。 我们可以使用 namespace 把应用划分到不同的命名空间,跟代码里的 namespace 是一个概念,只是为了划分空间。 # 创建命…...
【AI大模型新型智算中心技术体系深度分析 2024】
文末有福利! ChatGPT 系 列 大 模 型 的 发 布, 不 仅 引 爆 全 球 科 技 圈, 更 加 夯 实 了 人 工 智 能(Artificial Intelligence, AI)在未来改变人类生产生活方式、引发社会文明和竞争力代际跃迁的战略性地位。当…...
王道计算机数据结构+插入排序、冒泡排序、希尔排序、快速排序、简单选择排序
本内容是基于王道计算机数据结构的插入排序、冒泡排序、希尔排序、快速排序、简单选择排序整理。 文章目录 插入排序算法性能代码 冒泡排序算法性能代码 希尔排序算法性能代码 快速排序算法性能代码 简单选择排序算法性能代码 插入排序 算法 算法思想:每次将一个…...
python爬虫学习(三十三天)---多线程上篇
hello,小伙伴们!我是喔的嘛呀。今天我们来学习多线程方面的知识。 目录 一、了解多线程 (1)大概描述 (2)多线程爬虫的优势 (3)多线程爬虫的实现方式 (4)…...
JavaScript 原型链那些事
在讲原型之前我们先来了解一下函数。 在JS中,函数的本质就是对象,它与其他对象不同的是,创建它的构造函数与创建其他对象的构造函数不一样。那产生函数对象的构造函数是什么呢?是一个叫做Function的特殊函数,通过newFu…...
nginx的知识面试易考点
Nginx概念 Nginx 是一个高性能的 HTTP 和反向代理服务。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。 Nginx 专为性能优化而开发,性能是其最重要的考量指标,实现上非常注重效率&#…...
每日Attention学习9——Efficient Channel Attention
模块出处 [CVPR 20] [link] [code] ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks 模块名称 Efficient Channel Attention (ECA) 模块作用 通道注意力 模块结构 模块代码 import torch import torch.nn as nn import torch.nn.functional …...
Java语言程序设计——篇三(1)
选择结构 概述选择单分支if语句例题讲解 双分支if-else语句例题讲解 条件运算符多分支的if-else语句例题讲解 嵌套的if语句例题讲解 switch语句结构例题讲解代码演示运行结果 概述 Java中的控制结构,包括: 1、选择结构( if、if-else、switch ) 2、循环结…...
TinyMCE 5插件开发实战:手把手教你定制首行缩进功能(Vue版)
TinyMCE 5插件开发实战:手把手教你定制首行缩进功能(Vue版) 在内容创作领域,富文本编辑器的灵活性和扩展性往往决定了最终的用户体验。TinyMCE作为一款广受欢迎的富文本编辑器,其插件系统为开发者提供了无限可能。本文…...
[FFXIVChnTextPatch]:国际服中文补丁解决方案——从入门到精通
[FFXIVChnTextPatch]:国际服中文补丁解决方案——从入门到精通 【免费下载链接】FFXIVChnTextPatch 项目地址: https://gitcode.com/gh_mirrors/ff/FFXIVChnTextPatch 一、问题引入:当语言成为游戏体验的隐形壁垒 你是否曾在探索艾欧泽亚大陆时…...
告别重复造轮子,用快马AI一键生成高复用登录组件提升效率
在开发官网登录入口时,我们常常需要重复处理用户认证、表单验证、状态管理等基础逻辑。这些工作虽然不复杂,但每次从零开始确实会消耗不少时间。最近我发现用InsCode(快马)平台可以快速生成高质量的登录组件,大大提升了开发效率。 组件功能设…...
PCB首次上电安全操作与防炸板指南
PCB首次上电安全操作指南:从炸板事故中汲取的工程经验1. 硬件工程师的必修课:上电安全1.1 典型上电事故案例分析在嵌入式硬件开发领域,PCB首次上电环节隐藏着诸多技术风险。根据行业调查,约78%的硬件工程师在其职业生涯中至少经历…...
缺失的第一个正数(力扣100)
最朴素的想法就是从1开始查找,看看谁不在,时间复杂度为On但是需要把原数组变成集合,空间复杂度为On不符合题目的常数级空间开销我们要找的是“第一个缺失的正数”。如果数组长度是 $N$,那么这个答案一定落在 [1, N1] 这个区间里。…...
别再傻傻分不清了!用Simulink手把手带你搞懂导纳控制与阻抗控制的本质区别
导纳控制 vs 阻抗控制:从理论到Simulink实战的深度解析 在机器人控制领域,柔性交互是一个永恒的话题。想象一下,当机械臂需要完成精密装配任务时,既要有足够的刚性保证定位精度,又要在意外碰撞时表现出适当的柔顺性——…...
Uvicorn连接池配置:优化数据库连接性能的完整指南
Uvicorn连接池配置:优化数据库连接性能的完整指南 【免费下载链接】uvicorn An ASGI web server, for Python. 🦄 项目地址: https://gitcode.com/GitHub_Trending/uv/uvicorn Uvicorn作为一款高性能的ASGI web服务器,在Python Web应用…...
如何使用Compiler Explorer实时编译原理:揭秘代码到汇编的转换过程
如何使用Compiler Explorer实时编译原理:揭秘代码到汇编的转换过程 【免费下载链接】compiler-explorer Run compilers interactively from your web browser and interact with the assembly 项目地址: https://gitcode.com/gh_mirrors/co/compiler-explorer …...
告别低效苦读!研一新生文献阅读全流程AI工具选择指南(6款工具实战对比)
研一开学第一个月,导师丢来20篇英文文献让你"先看看"。你打开第一篇Nature子刊,密密麻麻的专业术语让你头皮发麻。用翻译软件逐句翻译?格式全乱了,图表公式看不懂。硬着头皮啃原文?一个下午只看完3页&#x…...
Cursor+Qt5.12.12开发环境配置全攻略:从插件安装到项目构建
CursorQt5.12.12开发环境配置全攻略:从插件安装到项目构建 对于刚接触Qt开发或从其他IDE迁移到Cursor的开发者来说,配置一个高效的开发环境是首要任务。Qt5.12.12作为长期支持版本(LTS),在稳定性和兼容性方面表现优异,而Cursor作为…...
