掌握Spring定时任务:@Scheduled注解实用手册,有两下子!

举报
bug菌 发表于 2024/07/28 16:48:23 2024/07/28
【摘要】 本专栏致力打造最硬核 Spring Boot 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。

📣前言

  在软件开发中,定时任务是常见的需求,用于执行周期性的工作。Spring框架提供了强大的支持来处理这类任务,其中@Scheduled注解是实现定时任务的关键工具之一。

  那么,具体如何实现呢?这将又会是干货满满的一期,全程无尿点不废话只抓重点教,具有非常好的学习效果,拿好小板凳准备就坐!希望学习的过程中大家认真听好好学,学习的途中有任何不清楚或疑问的地方皆可评论区留言或私信,bug菌将第一时间给予解惑,那么废话不多说,直接开整!Fighting!!

🌊环境说明

开发工具:IDEA 2021.3
JDK版本: JDK 1.8
Spring Boot版本:2.3.1 RELEASE
Maven版本:3.8.2


🏆本文收录于《Spring Boot从入门到精通》,专门攻坚指数提升,2023 年国内最系统+最强(更新中)。

本专栏致力打造最硬核 Spring Boot 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。


🌊摘要

    本文将详细介绍Spring框架中的@Scheduled注解,包括其基本概念、使用方法、以及如何与Spring的调度器集成。通过实际案例和测试用例,我们将展示如何使用@Scheduled注解来创建和管理定时任务。

🌊正文

  @Scheduled是Spring提供的一个用于简化定时任务创建的注解。它允许开发者以一种声明式的方式配置和执行定时任务。

搭建Spring Boot应用

  首先,我们先创建个基础的Spring Boot项目,如果还不会点这里,此处就不详细赘述啦。

概述

  @Scheduled注解可以应用于方法上,使得该方法成为一个定时任务。当与Spring的调度器结合使用时,这些方法将按照指定的计划执行。

核心源码解读

  @Scheduled注解的实现依赖于Spring的TaskExecutorTaskScheduler接口。Spring将使用@Scheduled注解的方法注册为任务,并按照注解中指定的计划执行。

案例分析

  考虑一个需要定期执行的数据库清理任务,我们可以使用@Scheduled注解来实现:

@Service
public class CleanupService {

    @Scheduled(fixedRate = 3600000) // 每小时执行一次
    public void performDatabaseCleanup() {
        // 实际的数据库清理逻辑
    }
}

代码解析:

  在本次的代码演示中,我将会深入剖析每句代码,详细阐述其背后的设计思想和实现逻辑。通过这样的讲解方式,我希望能够引导同学们逐步构建起对代码的深刻理解。我会先从代码的结构开始,逐步拆解每个模块的功能和作用,并指出关键的代码段,并解释它们是如何协同运行的。通过这样的讲解和实践相结合的方式,我相信每位同学都能够对代码有更深入的理解,并能够早日将其掌握,应用到自己的学习和工作中。

代码分析

  这段Java代码演示了如何在Spring框架中使用@Scheduled注解来创建一个定时执行的任务。以下是对这段代码的详细分析:

  1. CleanupService:这个类被标记为@Service,表示它是一个服务层组件,通常包含业务逻辑。

  2. @Scheduled(fixedRate = 3600000):这个注解应用于方法performDatabaseCleanup上,指示这个方法应该被Spring的调度器定期执行。fixedRate = 3600000参数指定了执行的间隔为3600000毫秒,即每小时执行一次。

  3. performDatabaseCleanup方法:这是一个公共方法,没有返回值,其作用是执行数据库清理逻辑。当Spring调度器触发这个方法时,它将执行数据库的清理工作。

使用场景

  这段代码适用于需要定期执行数据库维护任务的场景,例如:

  • 清理过期数据。
  • 优化数据库性能。
  • 执行定期的数据备份。

优缺点分析

优点

  • 自动化:定时任务的自动执行减少了人工干预的需求。
  • 灵活性:通过调整fixedRate参数,可以轻松改变任务的执行频率。

缺点

  • 资源消耗:定时任务可能会占用一定的系统资源,尤其是在高频率执行时。
  • 错误处理:需要适当的错误处理机制来确保任务执行的稳定性。

测试用例

  在实际开发中,可以通过以下方式测试这段代码:

  1. 启动应用程序:运行包含CleanupService的Spring应用程序。
  2. 观察执行:在控制台或日志文件中观察定时任务的执行情况。
  3. 验证结果:验证数据库是否按预期进行了清理。

测试结果预期

  执行测试用例后,预期定时任务将在每小时执行一次,并在控制台或日志中输出相应的执行信息。

测试代码分析

  测试代码通过启动Spring应用程序并观察定时任务的执行来验证其功能。这种方法适用于快速验证定时任务是否按预期工作。

小结

  通过这段代码,我们学习了如何在Spring应用程序中使用@Scheduled注解来配置和管理定时任务。这种方法提供了一种简单而有效的方式来实现周期性任务的自动化。

应用场景演示

  @Scheduled注解适用于多种场景,包括但不限于:

  • 定期数据备份
  • 定时发送电子邮件报告
  • 定时检查和修复数据一致性
  • 定时执行性能监控任务

优缺点分析

优点

  • 声明式配置:简化了定时任务的配置和实现。
  • 高度可配置:支持多种配置选项,如固定延迟、固定速率等。

缺点

  • 性能考虑:不当的定时任务配置可能会影响系统性能。
  • 错误处理:需要适当的错误处理机制来避免任务执行失败。

类代码方法介绍及演示

  以下是@Scheduled注解的一些常见属性:

  • fixedRate:在给定的间隔后重复执行。
  • fixedDelay:在方法执行结束后等待给定的间隔。
  • initialDelay:在首次执行之前等待的延迟。

测试用例

  以下是一个简单的测试用例,演示如何使用@Scheduled注解:

public class ScheduledDemo {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        context.register(SchedulingConfig.class);
        context.refresh();

        // 让定时任务运行一段时间
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        context.close();
    }
}

@Configuration
@EnableScheduling
class SchedulingConfig {
    @Bean
    public CleanupService cleanupService() {
        return new CleanupService();
    }
}

测试结果预期

  执行测试用例后,预期定时任务将按照配置的计划执行,并在控制台输出相应的执行日志。

测试代码分析

  接着我将对上述代码逐句进行一个详细解读,希望能够帮助到同学们,能以最快的速度对其知识点掌握于心,这也是我写此文的初衷,授人以鱼不如授人以渔,只有将其原理摸透,日后应对场景使用,才能得心应手,如鱼得水。所以如果有基础的同学,可以略过如下代码解析,针对没基础的同学,还是需要加强对代码的逻辑与实现,方便日后的你能更深入理解它并常规使用不受限制。

代码分析

  这段Java代码演示了如何在Spring框架中使用@EnableScheduling@Scheduled注解来创建和管理定时任务。以下是对这段代码的详细分析:

  1. ScheduledDemo:这个类包含了程序的入口点main方法,用于启动Spring应用程序并演示定时任务的执行。

  2. AnnotationConfigApplicationContext:创建了一个基于注解的Spring应用上下文,用于注册和加载配置类。

  3. context.register(SchedulingConfig.class);:注册了SchedulingConfig类,这个类使用@Configuration@EnableScheduling注解,用于配置Spring的调度器和定时任务。

  4. context.refresh();:刷新Spring应用上下文,这会触发Bean的创建和初始化,包括注册的定时任务。

  5. Thread.sleep(10000);:使主线程暂停10秒钟,这样做是为了让定时任务有足够的时间执行。这是一个简单的测试手段,用于观察定时任务是否按预期工作。

  6. 异常处理:使用try-catch块来捕获并处理InterruptedException,这是在调用Thread.sleep时可能抛出的异常。

  7. context.close();:在定时任务执行完成后,关闭Spring应用上下文,释放相关资源。

  8. SchedulingConfig:这是一个配置类,使用@Configuration注解,表示它包含Spring Bean的配置信息。@EnableScheduling注解开启对定时任务的支持。

  9. cleanupService Bean:在SchedulingConfig类中定义了一个cleanupService Bean,它是一个CleanupService实例,该实例中可能包含一个或多个使用@Scheduled注解的方法。

使用场景

  这段代码适用于需要在Spring应用程序中执行定时任务的场景,例如定期执行数据库清理、发送电子邮件提醒、清理临时文件等。

优缺点分析

优点

  • 声明式配置:通过注解简化了定时任务的配置和实现。
  • 高度可配置:支持多种配置选项,如固定延迟、固定速率等。

缺点

  • 性能考虑:使用Thread.sleep在实际生产环境中可能不是最佳实践,因为它会阻塞主线程。
  • 有限的灵活性:对于复杂的定时任务调度,可能需要更专业的作业调度器。

小结

  @Scheduled注解为Spring应用程序提供了一种简单的方式来创建和管理定时任务。通过本文的学习,我们了解到如何使用此注解以及如何与Spring的调度器集成。

总结

  @Scheduled注解是Spring框架中用于简化定时任务创建的强大工具。它通过提供一种声明式的方式来配置和执行定时任务,极大地简化了开发工作。然而,合理使用此注解,避免在复杂项目中产生难以管理的配置,也是我们需要考虑的问题。

  通过本文的深入分析和实践,我们希望能够帮助开发者更好地利用@Scheduled,构建高效、可维护的Spring应用程序。

寄语

  定时任务是应用程序的重要组成部分,尤其是在需要自动化执行周期性工作的场景中。掌握@Scheduled注解的使用,将帮助你更有效地实现这些功能。不断学习和实践,你将能够充分利用Spring框架提供的强大工具,构建更加健壮和灵活的应用程序。

  实际运用场景展示如下,这也是我日常项目开发中的实操之一,分享给大家看看,仅供参考:

  接着我将对上述代码进行详细的一个逐句解读,希望能够帮助到同学们,能以更快的速度对其知识点掌握学习,这也是我写此文的初衷,授人以鱼不如授人以渔,只有将其原理摸透,日后应对场景使用,才能得心应手,所以如果有基础的同学,可以略过如下代码分析步骤,然而没基础的同学,还是需要加强对代码的理解,方便你深入理解并掌握其常规使用。

  并附上部分相关注解源码截图,这里我就简单给附上,感兴趣的同学可以扒扒源码,深入去学习下开源框架的设计构思及理念,这也是掌握一个架构的核心目标,但是基础一般或者零基础的同学,建议先从使用上深入,而不是一口吃掉一个胖子,得不偿失。

… …

  ok,以上就是我这期的全部内容啦,若想学习更多,你可以持续关注我,我会把这个多线程篇系统性的更新,保证每篇都是实打实的项目实战经验所撰。只要你每天学习一个奇淫小知识,日积月累下去,你一定能成为别人眼中的大佬的!功不唐捐,久久为功!

「赠人玫瑰,手留余香」,咱们下期拜拜~~

🌊热文推荐

滴~如下推荐【Spring Boot 进阶篇】的学习大纲,请小伙伴们注意查收。

Spring Boot进阶(01):使用Spring Boot和Redis轻松实现高性能、高可用的缓存服务。

Spring Boot进阶(02):防止程序员疯狂 Debug:快速掌握 Validation 参数校验技巧,让你的代码健康起来!

Spring Boot进阶(03):【实战教程】MyBatis-Plus秒级实现字段自动填充,让你的代码更优雅!

Spring Boot进阶(04):震惊!使用MyBatis-Plus,快速实现自定义SQL分页功能!

Spring Boot进阶(05):Spring Boot与RabbitMQ完美融合,打造高效消息队列服务!

Spring Boot进阶(06):【超详细】Windows10搭建RabbitMQ Server服务端,让你轻松实现消息队列管理!

Spring Boot进阶(07):如何使用EasyPoi实现Java中Excel的导入导出?完整教程请收藏,让你的Excel操作更高效!

Spring Boot进阶(08):使用EasyPoi实现Excel/Word携带图片导出,打造精美的报表

Spring Boot进阶(09):用EasyPoi实现Excel多sheet导入导出,轻松管理海量数据!

Spring Boot进阶(10):「从Excel到PDF,EasyPoi助你一键完美转换!」

Spring Boot进阶(11):实现纯文本转成.csv格式文件,Spring Boot轻松搞定!附完整代码

Spring Boot进阶(12):如何快速获取Excel文件中的Sheet页数量?Spring Boot教程带你一步步实现

Spring Boot进阶(13):如何优雅获取@ApiModelProperty(value = “序列号“, name = “uuid“)中的value值,附源码

Spring Boot进阶(14):Spring Boot高级应用:手把手教你连接数据库并获取指定表结构!一文教会你

Spring Boot进阶(15):用Spring Boot实现动态数据库分页查询表结构信息!

Spring Boot进阶(16):使用Redis实现手机验证码功能,让你的用户注册更加便捷!

Spring Boot进阶(17):Swagger2高级配置:定制header请求头等参数

Spring Boot进阶(18):轻松管理定时任务!Spring Boot@Scheduled让你事半功倍

Spring Boot进阶(19):探索ElasticSearch:如何利用Spring Boot轻松实现高效数据搜索与分析

Spring Boot进阶(20):「打造高性能Web应用」——使用Jetty容器配置Spring Boot

Spring Boot进阶(21):优化Spring Boot应用性能,使用Undertow容器提升响应速度

Spring Boot进阶(22):决战容器之巅:Tomcat vs Undertow!性能对比分析揭秘最佳选择!

Spring Boot进阶(23):终极解决方案!教你实现高效文件上传!

Spring Boot进阶(24):秒传!快速实现高效多文件上传的最佳解决方案

Spring Boot进阶(25):如何写出高效的文件上传单元测试?让你的测试更智能更高效!

Spring Boot进阶(26):从小白到高手,掌握Mybatis中resultType和resultMap的秘密!

Spring Boot进阶(27):Spring Boot进阶(27):Kafka大显身手,快速构建消息驱动应用!(环境搭建+演示)

Spring Boot进阶(28):如何让Spring Boot应用在Linux中以后台服务方式启动,并实现滚动日志查看及保存至实体文件?

Spring Boot进阶(29):如何正确使用Spring Boot注解@PathVariable、@RequestParam和@RequestBody: Postman演示教程

Spring Boot进阶(30):@RestController与@Controller的区别及使用场景详解,附带精彩实战演示

… …

  若想系统性的从0到1的入门进阶学习,可以参考这篇专栏总结《2024最新首发,全网最全 Spring Boot 学习宝典(附思维导图)》本专栏致力打造全网最硬核 Spring Boot 学习及进阶SpringBoot 系列教学内容,🚀均为全网独家首发,致力打造精品硬核干货,专栏永持续更新。欢迎大家订阅学习。一分耕耘一份收获!

  如果想快速定位学习,可以看这篇【一站式教程导航】,你想学习的都被收录系统整理在内,以最快的速度投入并学习掌握!!你值得拥有。

  在入门及进阶之途,我必助你一臂之力,系统性学习,从入门到精通,带你不走弯路,直奔终点!投资自己,性价比永远最高,都这么说了,你还不赶紧来白嫖??

  本文涉及所有源代码,均已上传至GitHub开源,供同学们一对一参考 GitHub传送门,同时,原创开源不易,欢迎给个star🌟,想体验下被🌟的感jio,非常感谢❗

📣文末

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。