在SpringBoot中使用定时任务注解实现简单的定时任务

定时任务,其实在我们开发过程中经常会碰到的一个场景,比如,我现在想要给某些用户定时的发送一些短信呀,邮件呀什么的,也可以用来定时的检查或者监测我们对一些参数的处理。玩的花的可以用来帮我我们进行网页签到,甚至隔一段时间爬取网页的某些数据,具体还得看你怎么用,这里只提供一个定时任务案例,具体实施,得看你想怎么用了。

使用@Scheduled创建一个定时任务

在Spirng Boot中创建一个定时任务,我们可以通过Spring Boot的自带的注解来创建一个简单的定时任务,实现每隔一段时间输出当前的时间。

引入相关依赖:

		 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>

在我们的Spring Boot中的主类加入@EnableScheduing注解,启动定时任务配置:

@EnableScheduling
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

接下来,我们可创建一个简单的定时任务。

@Slf4j
@Component
@AllArgsConstructor
public class ScheduledTasks {private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");//创建一个定时任务执行时间,单位毫秒@Scheduled(fixedRate = 5000)public void reportCurrentTime() {log.info("现在时间:" + dateFormat.format(new Date()));}@Scheduled(cron = "0 0 12 * * ?")public void reportScheduled(){log.info("每天中午12点执行");}@Scheduled(fixedDelay = 5000) // 任务执行完毕后,延迟5秒再执行下一次public void reportTest(){log.info("任务执行完毕后,延迟5秒后再执行下一次");}}

在这里插入图片描述

接下来,我们可以看看@Scheduled的参数

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {String CRON_DISABLED = "-";String cron() default "";String zone() default "";long fixedDelay() default -1L;String fixedDelayString() default "";long fixedRate() default -1L;String fixedRateString() default "";long initialDelay() default -1L;String initialDelayString() default "";
}

String cron() default ""; 用于指定任务的执行时区。它是一个字符串,表示任务应该在哪个时区执行。例如,@Scheduled(cron = "0 0 12 * * ?", zone = "America/New_York")表示任务在美国纽约时区的中午12点执行。

String zone() default "";用于指定任务的执行时间表达式。它是一个字符串,遵循Cron表达式的语法规则。Cron表达式由6个或7个字段组成,分别表示秒、分钟、小时、日期、月份、星期和年份(可选)。例如,0 0 12 * * ?表示每天中午12点执行任务。

long fixedDelay() default -1L;上一次执行结束到下一次执行开始的间隔时间,单位毫秒 ms

String fixedDelayString() default ""; 与fixedDelay类似,用于指定任务的执行间隔时间。同样,fixedDelayString接受一个字符串参数,可以使用更友好的时间表达方式。

long fixedRate() default -1L; 用于指定任务的执行间隔时间(毫秒)。它表示每隔指定的时间执行一次任务,不考虑任务的执行时间。例如,@Scheduled(fixedRate = 5000)表示每隔5秒执行一次任务。

String fixedRateString() default ""; 与fixedRate类似,用于指定任务的执行间隔时间。同样,fixedRateString接受一个字符串参数,可以使用更友好的时间表达方式。

long initialDelay() default -1L; 用于指定任务的初始延迟时间(毫秒)。它表示在应用启动后,延迟指定的时间后开始执行第一次任务。例如,@Scheduled(initialDelay = 10000, fixedRate = 5000)表示在应用启动后延迟10秒开始执行第一次任务,然后每隔5秒执行一次任务。

String initialDelayString() default ""; 与initialDelay类似,用于指定任务的初始延迟时间。不同之处在于,initialDelayString接受一个字符串参数,可以使用更友好的时间表达方式,如"10s"表示10秒,"5m"表示5分钟,"1h"表示1小时,等等。

注意@Scheduled使用过多也是会存在问题的,具体有以下问题:

  • 依赖于应用程序的生命周期:@Scheduled注解是基于应用程序的生命周期来触发任务执行的。这意味着如果应用程序停止或重启,所有的定时任务也会被中断。因此,如果你的应用程序需要保证任务的连续执行,可能需要考虑其他的解决方案。

  • 单线程执行:默认情况下,@Scheduled注解使用单线程执行定时任务。这意味着如果一个任务的执行时间较长,会影响其他任务的执行。如果你的应用程序需要同时执行多个耗时任务,可能需要考虑使用线程池或其他并发机制来提高任务的执行效率。

  • 无法动态修改任务配置:一旦使用@Scheduled注解配置了定时任务,任务的执行时间和规则就固定了,无法在运行时动态修改。如果你的应用程序需要根据外部条件或配置来调整任务的执行时间,可能需要考虑其他的解决方案。

  • 缺乏集中管理:当应用程序中存在多个定时任务时,使用@Scheduled注解会导致任务的配置分散在不同的方法或类中,不便于集中管理和监控。如果你需要对定时任务进行集中管理和监控,可能需要考虑使用专门的定时任务框架或工具。

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

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

相关文章

前端:实现div元素选中与不可选中

默认情况下&#xff0c;div元素是可以选中的&#xff0c;但如果需要设置为不可被选中&#xff0c;可以设置为&#xff0c;如下&#xff1a; div {user-select: none; } 如果希望在某些情况下允许选择&#xff0c;可以在需要的地方覆盖这个样式。例如&#xff1a; div.allow…

AI模特换装的前端实现

本文作者为 360 奇舞团前端开发工程师 随着AI的火热发展&#xff0c;涌现了一些AI模特换装的前端工具&#xff08;比如weshop网站&#xff09;&#xff0c;他们是怎么实现的呢&#xff1f;使用了什么技术呢&#xff1f;下文我们就来探索一下其实现原理。 总体的实现流程如下&am…

笔记二十六、React中路由懒加载的扩展使用

26.1 在路由中配置懒加载 lazy routes/index.jsx 代码 import {Navigate} from "react-router-dom"; import Home from "../components/Home"; import About from "../components/About"; // import Classify from "../components/Home/c…

自动化测试框架搭建步骤教程

说起自动化测试&#xff0c;我想大家都会有个疑问&#xff0c;要不要做自动化测试&#xff1f; 自动化测试给我们带来的收益是否会超出在建设时所投入的成本&#xff0c;这个嘛别说是我&#xff0c;即便是高手也很难回答&#xff0c;自动化测试的初衷是美好的&#xff0c;而测试…

CAD精品Eyeshot Fem 2023.3.630 -2023-11-05 Crack

2023.3.630 更新25天前 分享 跟随还没有人关注 改进的 Brep.TransformBy() 方法修复了工具栏内存泄漏修复了 glTF 材质导出期间的异常改进了 glTF 材质金属粗糙度设置修复了渐进式绘图和剪辑平面的错误在 Workspace.UseShaders 属性设置器中添加了缺少的 RenderContext.MakeCur…

Linux基础操作一:连接Linux

1、连接方式 1.1、SSH连接 SSH是Secure Shell的缩写&#xff0c;用于加密远程连接和文件传输的协议。可以使用SSH连接到远程Linux服务器以及在本地访问Linux计算机。SSH连接可以用于执行命令或者上传或下载文件。 – 在Linux命令行中使用SSH连接&#xff1a;可以使用命令ssh…

2024中国眼博会,全国眼康与眼镜品牌加盟展会,北京眼健康展

立足北京&#xff0c;面向全球&#xff0c;2024第六届CEYEE中国眼博会&#xff0c;将以大规模的展览面积在4月与您相会&#xff1b; ——春天是万物复苏的季节&#xff0c;更是企业开拓市场&#xff0c;抓住春季发展机遇的重要时节&#xff1b;第六届CEYEE中国眼博会将在2024年…

Vue+ElementUI+C#技巧分享:周数选择器

文章目录 前言一、周数的计算逻辑1.1 周数的定义1.2 年初周数的确定1.3 周数的计算方法 二、VueElementUI代码实现2.1 计算周数2.2 获取周的日期范围2.3 根据周数获取日期范围2.4 控件引用2.4.1 控件引用代码分析2.4.2 初始化变量代码分析 2.5 周数选择器完整代码 三、C#后端代…

Vue大屏自适应终极解决方案

v-scale-screenv-scale-screen是一个大屏自适应组件&#xff0c;在实际业务中&#xff0c;我们常用图表来做数据统计&#xff0c;数据展示&#xff0c;数据可视化等比较直观的方式来达到一目了然的数据查看&#xff0c;但在大屏开发过程中&#xff0c;常会因为适配不同屏幕而感…

sklearn 笔记:聚类

1 sklearn各方法比较 方法名称参数使用场景K-means簇的数量 非常大的样本数 中等簇数 簇大小需要均匀 Affinity Propagation 阻尼系数 样本偏好 样本数不能多 簇大小不均 MeanShift带宽 样本数不能多 簇大小均匀 谱聚类簇的数量 中等样本数 小簇数 簇大小均匀 层次聚类簇的数量…

【安全】【Linux】通过/proc/pid/获取进程信息

1 关于/proc /proc是一个内存文件系统&#xff0c;它保存了系统运行的信息&#xff0c;比如&#xff0c;系统启动时间、内存使用率等&#xff0c;同时&#xff0c;对于每个进程&#xff0c;都会有一个目录保存该进程的信息。 2 进程的基本信息 这里不会列出所有的文件&#…

职业测评链接

职业测评链接&#xff1a; https://www.16personalities.com/ch?utm_sourceresults-turbulent-campaigner&amp%3Butm_mediumemail&amp%3Butm_campaignch&amp%3Butm_contentlogo-0

selenium脚本编写及八大元素定位方法

selenium脚本编写 上篇文章介绍了selenium环境搭建&#xff0c;搭建好之后就可以开始写代码了 基础脚本,打开一个网址 from selenium import webdriver driver webdriver.Chrome()#打开chrome浏览器 driver.get(https://www.baidu.com) #打开百度打开本地HTML文件 上篇文章…

docker部署禅道18.3及官方文档中未提及的问题处理

禅道部署方式 文档地址:https://www.zentao.net/book/zentaopms/38.html#61.拉取镜像 docker pull easysoft/zentao:18.32.创建网络 docker network create --subnet172.172.172.0/24 zentaonet3.启动容器 docker run --name zentao -p 8090:80 -p 3307:3306 \ --networkze…

线性方程组的迭代法(Jacobi 迭代法和Gauss-Seidel 迭代法) C++代码

Jacobi 迭代法 #include <iostream> #include <cmath> #include <vector>using namespace std;// 定义方程组的系数矩阵和常数向量 vector<vector<double>> A {{20, 2, 3},{1, 8, 1},{2, -3, 15}}; vector<double> b {24, 12, 30};// 定…

brat文本标注工具——安装

目录 一、Linux系统安装 1. centOS系统 2. Ubuntu系统 3. macOS系统 4.说明 二、Google Chrome安装 1. 打开命令行&#xff0c;切换到管理者权限 2. 安装依赖 3. 下载Google浏览器的安装包 4. 安装Google Chrome 三、yum更新 四、Apache安装 安装Apache 启动Apac…

threeJs引入模型使用3D模型(vite+React+Ts)

要在 Three.js 中使用 3D 模型&#xff0c;你需要加载模型文件并将其添加到场景中。Three.js 支持多种不同的模型格式&#xff0c;比如 OBJ、FBX、GLTF 等。 init vitelatest //创建一个vite的脚手架 选择react并配置Ts 安装three.js准备 npm install react-three/drei np…

a-select:远程搜索——防抖节流处理——基础积累

a-select:远程搜索——防抖节流处理——基础积累 效果图下拉筛选数据&#xff1a;远程搜索功能&#xff1a; 效果图 下拉筛选数据&#xff1a; <a-selectshow-searchv-model"form.jobPositionCode"placeholder"请选择岗位"style"width: 100%"…

Redis哈希对象(listpack介绍)

哈希对象的编码可以是ziplist或者hashtable。再redis5.0版本之后出现listpack&#xff0c;为了是代替ziplist。 一. 使用ziplist编码 ziplist编码的哈希对象使用压缩列表作为底层实现&#xff0c;每当有新的键值对要加入到哈希对象时&#xff0c;程序都会先将保存了键值对的键…

【Linux 静态IP配置】

静态IP配置 1.NAT模式设置2.设置静态ip3.重启网络4.查看ip 1.NAT模式设置 首先设置虚拟机中NAT模式的选项&#xff0c;打开VMware&#xff0c;点击“编辑”下的“虚拟网络编辑器”&#xff0c;设置NAT参数 注意&#xff1a; VMware Network Adapter VMnet8保证是启用状态 …