当前位置: 首页 > news >正文

Spring Boot 实现定时任务

1. 启用定时任务支持

首先,需要在 Spring Boot 应用的主类或者任何配置类中添加 @EnableScheduling 注解,以启用定时任务支持。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;@SpringBootApplication
@EnableScheduling
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}

2. 创建定时任务方法

接下来,可以在任意的 Spring Bean(通常是一个 @Service@Component)中创建一个使用 @Scheduled 注解的方法。该方法会根据指定的时间间隔或触发条件自动执行。

2.1 使用 @Scheduled 注解

@Scheduled 注解支持多种形式的时间配置:

  • fixedRate:按照固定的时间间隔(以毫秒为单位)执行,任务开始时计算间隔。
  • fixedDelay:按照固定的延迟(以毫秒为单位)执行,任务完成后计算间隔。
  • cron:使用 Cron 表达式指定执行时间。

示例代码:

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
public class MyScheduledTasks {// 每隔5秒执行一次@Scheduled(fixedRate = 5000)public void executeTaskWithFixedRate() {System.out.println("Task executed at fixed rate: " + System.currentTimeMillis());}// 上一个任务完成后5秒执行@Scheduled(fixedDelay = 5000)public void executeTaskWithFixedDelay() {System.out.println("Task executed with fixed delay: " + System.currentTimeMillis());}// 每天早上8点执行@Scheduled(cron = "0 0 8 * * ?")public void executeTaskWithCronExpression() {System.out.println("Task executed using cron expression: " + System.currentTimeMillis());}
}

3. 配置 @Scheduled 参数

Spring Boot 中的 @Scheduled 注解支持配置文件中的参数,这样可以灵活地修改定时任务的执行间隔或时间,而无需修改代码。

示例:

application.propertiesapplication.yml 中定义参数:

myapp.scheduling.fixed-rate=5000
myapp.scheduling.cron=0 0 8 * * ?

然后在代码中使用 @Value 注解注入这些参数:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
public class MyScheduledTasks {@Value("${myapp.scheduling.fixed-rate}")private long fixedRate;@Value("${myapp.scheduling.cron}")private String cronExpression;@Scheduled(fixedRateString = "${myapp.scheduling.fixed-rate}")public void executeTaskWithFixedRate() {System.out.println("Task executed at fixed rate: " + System.currentTimeMillis());}@Scheduled(cron = "${myapp.scheduling.cron}")public void executeTaskWithCronExpression() {System.out.println("Task executed using cron expression: " + System.currentTimeMillis());}
}

总结

      Spring Boot 是基于Spring框架的一个开发框架,它提供了一种简化的方式来开发独立的、独立的、可执行的Spring应用程序。在Spring Boot中实现定时任务可以帮助我们在特定的时间间隔内执行一些特定的任务。本文将以层级的方式总结Spring Boot实现定时任务的相关知识。

  1. 理解定时任务 定时任务是在特定的时间间隔内执行某个任务的机制。Spring Boot提供了一个注解@EnableScheduling,可以开启定时任务的支持。使用该注解后,只需要在任意一个Spring Bean的方法上添加注解@Scheduled,即可定义一个定时任务。

  2. 注解@Scheduled @Scheduled可以用于标记一个方法是一个定时任务。它可以接受多个参数来指定任务的执行时间。其中常用的参数有:

  • fixedRate: 指定任务的执行频率,单位是毫秒。例如,@Scheduled(fixedRate = 1000)表示任务每秒执行一次。
  • fixedDelay: 指定任务之间的延迟时间,单位是毫秒。例如,@Scheduled(fixedDelay = 1000)表示任务执行完毕后,延迟1秒再执行下一次任务。
  • cron: 使用Cron表达式来定义任务的执行时间。例如,@Scheduled(cron = "0 0 0 * * ?")表示每天凌晨零点执行任务。
  1. 定时任务的执行 定时任务默认是在Spring Boot应用程序的启动时自动执行的。可以通过设置参数spring.task.scheduling.enabled=false来禁用自动执行。如果需要在特定的时间启动定时任务,可以使用注解@PostConstruct来标记一个方法,在该方法中手动启动定时任务。例如:
@Component
public class MyTask {@PostConstructpublic void init() {// 手动启动定时任务}@Scheduled(fixedRate = 1000)public void doTask() {// 定时任务的执行逻辑}
}

  1. 定时任务的线程池 Spring Boot使用一个线程池来执行定时任务,默认线程池大小为1。如果有大量的定时任务,并发执行任务的能力可能会有所不足。可以通过设置参数spring.task.scheduling.pool.size来调整线程池的大小。例如,设置spring.task.scheduling.pool.size=10表示线程池大小为10。

  2. 异步定时任务 定时任务默认是同步执行的,即任务的执行会阻塞其他任务的执行。如果有需要并发执行的任务,可以使用注解@Async将定时任务标记为异步执行。例如:

@Component
public class MyTask {@Async@Scheduled(fixedRate = 1000)public void doTask() {// 异步执行的定时任务}
}

需要注意的是,使用@Async注解的方法必须在一个被@Configuration注解的类中,并且该类必须被@EnableAsync注解开启异步支持。

  1. 定时任务的异常处理 定时任务的执行过程中可能会出现异常。Spring Boot提供了一个接口SchedulingConfigurer,可以用来配置定时任务的异常处理器。可以通过实现该接口并重写configureTasks方法来自定义异常处理逻辑。例如:
@Configuration
@EnableScheduling
public class MyTaskConfig implements SchedulingConfigurer {@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {taskRegistrar.setScheduler(taskExecutor());}@Bean(destroyMethod = "shutdown")public Executor taskExecutor() {return Executors.newScheduledThreadPool(10);}
}

在重写的configureTasks方法中,可以通过taskRegistrar.setScheduler方法来设置定时任务的线程池。在上述示例中,使用了Executors.newScheduledThreadPool(10)方法来创建一个线程池,大小为10。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • mysql实现分布式锁
  • 力学笃行(五)Qt key绑定、钩子(hook)
  • H5漂流瓶交友源码_社交漂流瓶H5源码
  • csrf漏洞(二)
  • GNS3 IOU: License section not found in iourc file /tmp/tmpj54abrhf/iourc
  • day01-作业题
  • 深度学习入门(E):逻辑回归与分类到底是啥关系?
  • CoOp(论文解读):Learning to Prompt for Vision-Language Models
  • C:指针学习-指针变量—学习笔记
  • 手机群控爬取实战
  • 数据结构与算法--插入排序与选择排序
  • Upload-Lab第11关:如何巧妙使用双写绕过黑名单验证
  • 大模型智能体可以用来实现哪些需求?
  • 防火墙技术与地址转换
  • 服务器主要有什么用途?什么情况下需要服务器?
  • [iOS]Core Data浅析一 -- 启用Core Data
  • CSS 提示工具(Tooltip)
  • FineReport中如何实现自动滚屏效果
  • JavaScript 奇技淫巧
  • mysql 数据库四种事务隔离级别
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 前端js -- this指向总结。
  • 三分钟教你同步 Visual Studio Code 设置
  • 微信小程序设置上一页数据
  • 我的业余项目总结
  • 写给高年级小学生看的《Bash 指南》
  • HanLP分词命名实体提取详解
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 如何正确理解,内页权重高于首页?
  • #100天计划# 2013年9月29日
  • #pragma multi_compile #pragma shader_feature
  • #大学#套接字
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (3)nginx 配置(nginx.conf)
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (void) (_x == _y)的作用
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (一)RocketMQ初步认识
  • (转) ns2/nam与nam实现相关的文件
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • ***原理与防范
  • *2 echo、printf、mkdir命令的应用
  • ... 是什么 ?... 有什么用处?
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 设计模式初探
  • .net打印*三角形