SpringBoot 实现定时任务

2023-11-16

一、使用背景

定时任务在实际项目开发中很常见,并且定时任务可以在各种场景中应用,通过自动化操作和任务的规模化管理,提高效率、可靠性和工作质量。可以减少手动操作,避免疏忽和错误,并节省时间和人力资源的投入


二、定时任务的优点

  • 简单易用:使用注解驱动的方式,简化了定时任务的配置和管理。通过添加@Scheduled注解,可以将普通的方法标记为定时任务,而不需要手动编写定时任务调度的代码。
  • 内置任务调度器:Spring Boot内置了一个轻量级的任务调度器,可以方便地执行定时任务。它提供了线程池、任务管理和并发处理等功能,可以高效地管理和执行任务。
  • 灵活的配置选项:@Scheduled注解支持各种配置选项,例如cron表达式、fixedRate、fixedDelay等,可以非常灵活地定义任务的触发时间和频率。这使得开发人员能够根据具体需求精确控制定时任务的执行方式

总的来说,Spring Boot定时任务提供了简单、灵活和可扩展的方式来进行任务调度。开发人员可以通过少量的配置和注解来创建定时任务,并利用Spring的特性和生态系统来增强定时任务的功能和性能


三、SpringBoot 实现定时任务

3.0 项目结构

3.1 pom.xml

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

3.2 启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

// 开启定时任务注解
@EnableScheduling 
@SpringBootApplication
public class ScheduledApplication {

    public static void main(String[] args) {
        SpringApplication.run(ScheduledApplication.class, args);
    }

}

3.3 服务类

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

@Service
@Slf4j
public class scheduledService {
    /* 每两秒执行一次 */
    @Scheduled(cron = "0/2 * * * * ?")
    public void scheduledTasks() {
        log.info("根据cron表达式的定时执行规则,执行任务~");
    }
    
}

3.4 cron表达式

3.4.1 时间范围

Cron表达式由空格分隔的6个或7个字段组成,每个字段代表一个时间单位。字段的取值范围如下:

参数 是否必须 范围 支持的特殊字符
秒(Seconds) 0 ~ 59 *,- /
分(Minutes) 0 ~ 59 *,- /
时(Hours) 0 ~ 23 *,- /
日(DayofMonth) 1 ~ 31 *,- /? L W
月(Month) 1 ~ 12 *,- /
星期(DayofWeek) 1 ~ 7 *,- /? L #
年(Year) 1970 ~ 2099 - * /

3.4.2 特殊字符

  • (星号):通配符,表示每个时间单位。例如 * * * * ?表示每一秒执行一次。

  • ?(问号):该字符用于在日期和星期字段中指定"不指定值"。一般情况下,日期和星期两个字段只能指定一个值,另一个字段要使用问号进行占位。例如0 0 12 ? * MON-FRI表示在每个星期一至星期五的12点执行。

  • -(连字符):范围符号,用于指定一个时间单位的取值范围。例如10-30 * * * * ?表示在每分钟的第10秒到第30秒之间执行。

  • ,(逗号):枚举符号,用于指定多个时间单位取值的列表。例如1,3,5 * * * * ?表示在每小时的第1分、第3分和第5分执行。

  • /(斜杠):间隔符号,用于指定时间单位的间隔。例如0/5 * * * * ?表示每5秒执行一次。

  • L(最后的):特殊字符,用于指定某个时间单位的最后一个值。例如0 0 12 L * ?表示在每个月的最后一天的12点执行。

  • W(工作日):特殊字符,用于指定距离给定日期最近的工作日(周一至周五)。例如15W * * * ?表示在每个月的第15个工作日当天执行。

  • #(井号):特殊字符,用于指定某个月份的第几个星期几。例如0 0 12 ? * 6#3表示在每个月的第三个星期五的12点执行。

3.4.3 cron工具

Cron在线表达式生成器

3.5 启动,测试

在这里插入图片描述


四、使用定时任务注意点

避免耗时操作

定时任务的执行应尽量避免执行长时间运行的操作,或者涉及到大量数据处理的任务。因为定时任务是按照预定的时间间隔循环执行的,如果任务执行时间过长,可能会导致任务堆积和性能下降

处理异常情况

在定时任务的执行过程中,难免会遇到一些异常情况。需要确保任务的健壮性,即使出现异常也能够妥善处理,而不会导致整个任务调度系统的崩溃

定时任务的幂等性

在设计定时任务时,需要考虑任务的幂等性,即任务可以重复执行而不会影响最终结果。确保任务的执行逻辑和数据操作是幂等的,以避免数据错误和重复处理的问题。

注意这些要点可以帮助你使用定时任务更加稳定和可靠。根据实际情况,可能还需要考虑其他的因素,如分布式环境下的任务调度、任务依赖关系、任务优先级等

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot 实现定时任务 的相关文章

  • 如何在一行中将字符串数组转换为双精度数组

    我有一个字符串数组 String guaranteedOutput Arrays copyOf values values length String class 所有字符串值都是数字 数据应转换为Double QuestionJava 中
  • 在Windows上安装Java 11 OpenJDK(系统路径问题)

    Java 11 最近发布了 众所周知 这个版本没有安装文件 当然 要在没有安装程序的情况下安装 Java 我将系统设置 PATH 和 JAVA HOME 设置为解压缩 Java 11 的文件夹的地址 根据对类似问题的已接受回复建议 唯一的事
  • JNI 不满意链接错误

    我想创建一个简单的 JNI 层 我使用Visual studio 2008创建了一个dll Win 32控制台应用程序项目类型 带有DLL作为选项 当我调用本机方法时 出现此异常 Exception occurred during even
  • Java8无符号算术

    据广泛报道 Java 8 具有对无符号整数的库支持 然而 似乎没有文章解释如何使用它以及有多少可能 有些函数 例如 Integer CompareUnsigned 很容易找到 并且似乎可以实现人们所期望的功能 但是 我什至无法编写一个简单的
  • IntelliJ IDEA 创建的 JAR 文件无法运行

    我在 IntelliJ 中编写了一个跨越几个类的程序 当我在 IDE 中测试它时它运行良好 但是 每当我按照教程将项目制作成 jar 可执行文件时 它就不会运行 双击 out 文件夹中的文件时 该文件不会运行 并显示 无法启动 Java J
  • 在数据流模板中调用 waitUntilFinish() 后可以运行代码吗?

    我有一个批处理 Apache Beam 作业 它从 GCS 获取文件作为输入 我的目标是根据执行后管道的状态将文件移动到两个 GCS 存储桶之一 如果管道执行成功 则将文件移动到存储桶 A 否则 如果管道在执行过程中出现任何未处理的异常 则
  • java中删除字符串中的特殊字符?

    如何删除字符串中除 之外的特殊字符 现在我用 replaceAll w s 它删除了所有特殊字符 但我想保留 谁能告诉我我该怎么办 Use replaceAll w s 我所做的是将下划线和连字符添加到正则表达式中 我添加了一个 连字符之前
  • hibernate总是自己删除表中的所有数据

    您好 我正在开发一个 spring mvc 应用程序 它使用 hibernate 连接到存储文件的 mysql 数据库 我有两个方法 一个方法添加我选择的特定文件路径中的所有文件 另一种方法调用查询以返回从 mysql 存储的文件列表 问题
  • 使用替换字符串中多个单词的最有效方法[重复]

    这个问题在这里已经有答案了 此刻我正在做 Example line replaceAll replaceAll cat dog replaceAll football rugby 我觉得那很丑 不确定有更好的方法吗 也许循环遍历哈希图 ED
  • Microsoft Graph 身份验证 - 委派权限

    我可以使用 Microsoft Graph 访问资源无需用户即可访问 https developer microsoft com en us graph docs concepts auth v2 service 但是 此方法不允许我访问需
  • Spring引导@Transactional

    spring boot会自动在controller层添加 Transactional注解吗 我尝试将 Transactional 放在服务层 但似乎控制器层覆盖了注释 我有这个配置
  • Spring Data 与 Spring Data JPA 与 JdbcTemplate

    我有信心Spring Data and Spring Data JPA指的是相同的 但后来我在 youtube 上观看了一个关于他正在使用JdbcTemplate在那篇教程中 所以我在那里感到困惑 我想澄清一下两者之间有什么区别Spring
  • 使用 AWS Java SDK 为现有 S3 对象设置 Expires 标头

    我正在更新 Amazon S3 存储桶中的现有对象以设置一些元数据 我想设置 HTTPExpires每个对象的标头以更好地处理 HTTP 1 0 客户端 我们正在使用AWS Java SDK http aws amazon com sdkf
  • org.jdesktop.application 包不存在

    几天以来我一直在构建一个 Java 桌面应用程序 一切都很顺利 但是今天 当我打开Netbeans并编译文件时 出现以下编译错误 Compiling 9 source files to C Documents and Settings Ad
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • Java中未绑定通配符泛型的用途和要点是什么?

    我不明白未绑定通配符泛型有什么用 具有上限的绑定通配符泛型 stuff for Object item stuff System out println item Since PrintStream println 可以处理所有引用类型 通
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • 将 JSON 参数从 java 发布到 sinatra 服务

    我有一个 Android 应用程序发布到我的 sinatra 服务 早些时候 我无法读取 sinatra 服务上的参数 但是 在我将内容类型设置为 x www form urlencoded 之后 我能够看到参数 但不完全是我想要的 我在
  • 如何测试 spring-security-oauth2 资源服务器安全性?

    随着 Spring Security 4 的发布改进了对测试的支持 http docs spring io spring security site docs 4 0 x reference htmlsingle test我想更新我当前的
  • 将2-3-4树转换为红黑树

    我正在尝试将 2 3 4 树转换为 java 中的红黑树 但我无法弄清楚它 我将这两个基本类编写如下 以使问题简单明了 但不知道从这里到哪里去 public class TwoThreeFour

随机推荐

  • 怎样监听音频播放完毕?

    非常简单 获取当前点击的音频的DOM元素myAudio myAuto addEventListener ended function myAuto pause alert 播放完毕 2 监听ended事件
  • 请求端nginx修改X-Frame-Options

    location dashboard db proxy hide header X Frame Options 忽略返回头的X Frame Options add header X Frame Options SAMEORIGIN alwa
  • windows认证&密码抓取

    文章目录 基础知识 windows版本历史 一 工作组部分 密码存放在哪里 NTML Hash windows本地认证 windows网络认证 NTML v1与v2 二 域部分 kerbero协议 白银票据 黄金票据 windows密码导出
  • Arduino-VScode-Platformio离线安装,99%成功!

    视频教程链接 https www bilibili com video BV1g34y1p7Fu 1 优点 1 完全离线安装 过程不需要联网 解决新建项目慢 编译慢的问题 2 解决Platformio不支持特殊路径的问题 比如中文 空格等
  • 前端页面点击姓名查看详情

    前端页面点击姓名查看详情 field realName width 120 title 姓名 templet realName function realName d return div a href class layui table
  • 华为数通方向HCIP-DataCom H12-821题库(单选题:361-380)

    第361题 如图所示是一台路由器的BGP输出信息 那么以下关于这段信息的描述 错误的是哪一项
  • java.lang.UnsupportedClassVersionError: org/sonar/batch/bootstrapper/EnvironmentInformation --已解决

    执行SonarScanner MSBuild exe end 向sonar平台上传报告时 报错 ERROR Error during SonarScanner execution java lang UnsupportedClassVers
  • 【opencv】error: (-215:Assertion failed) ssize.empty() in function ‘cv::resize‘报错原因

    这两天连续两次遇到这个问题 于是决定记录一下报错原因 1 路径有问题 路径中不能出现中文 相对路径应该改为绝对路径 路径之间应该用 而不是 2 读取的文件夹中存在不合规范的图片 我的文件夹中因为混入了一个json文件而读取失败 此时应该添加
  • 华为服务器cpu是否支持虚拟化,处理器配置 - 华为服务器 Brickland平台 BIOS 参数参考 30 - 华为...

    处理器槽位 处理器插座序号 RH8100 V3服务器的本页面与其他服务器有以下区别 单系统模式时 处理器槽位 显示为 槽位1 槽位8 双系统模式时 系统 A 的 处理器槽位 显示为 槽位1 槽位4 双系统模式时 系统 B 的 处理器槽位 显
  • cache是什么?作用是什么?位置在哪?

    文章目录 博文01 博文02 博文03 参考 01 https wenwen sogou com z q654876765 htm 02 https zhidao baidu com question 7859370 html 博文01 高
  • python水仙花数

    题目 打印出所有的 水仙花数 所谓 水仙花数 是指一个三位数 其各位数字立方和等于该数本身 例如 153是一个 水仙花数 因为153 1的三次方 5的三次方 3的三次方 def narcissus narcissus number grou
  • 设计模式中的五大原则

    设计模式是一种思想 是智慧的结晶了 它有利于我们快速构建高效 模块化 高扩展性的代码 这种思想不仅仅在c 中有 c代码中也是有很充分的使用 设计模式是前提 是重中之重 那比它更重要的是什么 是原则 面向对象设计五大原则 1 单一职责原则 S
  • 爬虫用拨号好还是HTTP爬虫ip池好?

    程序员小伙伴们 在进行爬虫时 你是否曾纠结于选择拨号还是代理 不要犯愁 今天我将与你分享一些实用的择优技巧 帮助你在爬虫之路上实现更高效的提速 一 拨号和HTTP爬虫ip的优劣势分析 1 拨号 优势 拨号具有动态HTTP的特点 每次拨号连接
  • ajax加载aspx页面,如何使用jquery ajax显示来自aspx页面的响应

    我使用ajax jquery来请求aspx页面 并且此页面显示GidView 因此响应将是网格视图的html代码 并且我将响应添加到DIV以显示结果 当我在第一次发出请求时正常工作 但第二次没有从响应中添加任何内容 尽管存在要绑定的数据 如
  • git 仓库迁移

    git 仓库迁移 文章目录 git 仓库迁移 在目标服务器建立新的git 功能仓库 设置git 仓库源 上传代码 验证是否成功 git远程仓库地址查看 在目标服务器建立新的git 功能仓库 git VM 0 5 centos git ini
  • MySQL中的IF语句使用

    MySQL中的IF语句 在 MySQL 数据库中 IF 语句是一种常见的条件控制语句 它可以根据指定的条件返回不同的结果 在本文中 我们将介绍 IF 语句的基本用法以及实际应用场景 IF函数 MySQL 提供了 IF 函数来实现 IF 语句
  • xcode4的自动完成功能(Code sense or Code Snippet)

    社区会员rainbird分享 自动完成包括两种含义 一种是输入字母的时候可以动态弹出一个列表 然后通过选择 提高输入效率 这种好像叫代码提示 Code sense 另一种就是输入几个字母的时候一回车 出来一串儿字符 Code Snippet
  • 把一个对象 转为JSON格式的方法

    List
  • svn的使用手册

    svn的使用手册 svn的使用手册 svn介绍 安装svn 安装VisualSVN server 安装TortoiseSVN 安装EclipseSVN插件 使用SVN Eclipse下使用SVN 合并冲突 分支 svn的使用手册 svn介绍
  • SpringBoot 实现定时任务

    定时任务 一 使用背景 二 定时任务的优点 三 SpringBoot 实现定时任务 3 0 项目结构 3 1 pom xml 3 2 启动类 3 3 服务类 3 4 cron表达式 3 4 1 时间范围 3 4 2 特殊字符 3 4 3 c