springboot中的定时任务编写

第1部分:引言

1.1 定时任务的重要性

在现代软件开发中,定时任务是应用程序自动化和运维效率的关键组成部分。无论是数据备份、系统健康检查、定期报告生成,还是用户活动触发的自动化流程,定时任务都扮演着不可或缺的角色。它们确保了业务逻辑的连续性和系统的自我维护能力。

1.2 定时任务在不同领域的应用
  • 企业资源规划(ERP)系统:定时任务可以用于生成财务报告、库存更新等。
  • 内容管理系统(CMS):定时发布内容、清理缓存等。
  • 客户关系管理(CRM)系统:定时发送营销邮件、客户跟进提醒等。
  • 在线广告平台:定时调整广告投放策略、优化广告展示等。
1.3 传统定时任务实现的挑战

在传统的开发模式中,实现定时任务往往需要依赖操作系统的计划任务(如Linux的crontab)或者编写复杂的业务逻辑。这些方法存在诸多不便:

  • 配置复杂:需要对操作系统的任务调度器有深入了解。
  • 维护困难:任务分散在不同的系统和应用中,难以统一管理和监控。
  • 扩展性差:随着业务增长,增加或修改任务变得复杂和耗时。
1.4 Spring Boot的解决方案

Spring Boot作为一个流行的Java框架,提供了一种更加优雅和集成的方式来实现定时任务。它通过简化配置和提供丰富的API,使得开发者能够快速地在应用程序中集成定时任务功能。

1.5 Spring Boot对定时任务的支持

Spring Boot通过@EnableScheduling@Scheduled注解,使得在Spring应用中编写和配置定时任务变得异常简单。此外,Spring Boot还提供了与Spring Task Scheduler的集成,这为更高级的定时任务需求提供了支持。

1.6 为什么选择Spring Boot实现定时任务
  • 简化配置:通过注解和少量配置即可实现定时任务。
  • 易于集成:与Spring生态系统无缝集成,可以利用Spring的其他功能,如事务管理、依赖注入等。
  • 强大的社区支持:Spring Boot拥有庞大的开发者社区,提供了大量的资源和最佳实践。
  • 易于测试:Spring Boot的定时任务可以很容易地进行单元测试和集成测试。

第2部分:Spring Boot简介

2.1 Spring Boot概述

Spring Boot是由Pivotal团队(现在是VMware的一部分)开发的,基于Spring框架的一个模块化、快速开发和部署的框架。它旨在简化Spring应用的初始搭建以及开发过程,通过提供一系列默认配置来减少开发者的配置工作。

2.2 Spring Boot的核心特性
  • 自动配置:Spring Boot能够根据项目中的依赖自动配置Spring应用。
  • 独立运行:Spring Boot应用包含内嵌的HTTP服务器(如Tomcat、Jetty或Undertow),无需部署到外部服务器。
  • 无需XML配置:Spring Boot不需要使用XML配置文件,尽管它仍然支持XML配置。
  • 微服务支持:Spring Boot非常适合微服务架构,易于构建、部署和扩展。
2.3 Spring Boot的启动机制

Spring Boot应用的启动是通过SpringApplication.run()方法实现的,它会自动创建并配置Spring应用上下文。Spring Boot还提供了命令行界面(CLI)和Actuator端点来监控和管理应用。

2.4 Spring Boot的依赖管理

Spring Boot通过spring-boot-starter-parent提供依赖管理,简化了Maven和Gradle项目的配置。它预定义了版本号和依赖范围,使得依赖冲突和版本控制更加容易管理。

2.5 Spring Boot的社区和插件生态

Spring Boot拥有一个活跃的开源社区,提供了大量的插件和“Starters”,这些Starters包含了构建特定功能所需的依赖,如spring-boot-starter-web用于构建RESTful应用。

2.6 示例:创建一个简单的Spring Boot应用

下面是一个创建简单Spring Boot应用的步骤,以及对应的示例代码:

  1. 创建项目结构:使用Spring Initializr(https://start.spring.io/)快速生成项目结构。
  2. 添加依赖:选择需要的Starters,例如spring-boot-starter-web
  3. 编写主应用类
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class MyApp {
        public static void main(String[] args) {
            SpringApplication.run(MyApp.class, args);
        }
    }
    
  4. 创建REST控制器
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class MyController {
        @GetMapping("/")
        public String home() {
            return "Hello, Spring Boot!";
        }
    }
    
2.7 Spring Boot的部署方式
  • 打包为JAR:Spring Boot应用可以打包成一个可执行的JAR文件,通过java -jar命令运行。
  • 容器化部署:Spring Boot应用非常适合Docker等容器化技术,易于在云环境中部署。
2.8 Spring Boot与Spring Framework的关系

Spring Boot并不是Spring Framework的替代品,而是一种基于Spring Framework的快速开发方式。它提供了一种快速启动Spring应用的方法,同时保持了Spring Framework的所有特性和灵活性。

2.9 为什么选择Spring Boot
  • 快速开发:Spring Boot的自动配置和简化的配置方式使得开发更加快速。
  • 易于部署:内嵌的HTTP服务器和容器化支持使得部署变得简单。
  • 社区支持:Spring Boot的社区提供了大量的资源、插件和最佳实践。
2.10 结论

Spring Boot是一个为现代Java开发而设计的框架,它通过简化配置和提供一系列开箱即用的功能,使得开发者可以专注于业务逻辑的实现,而不是基础设施的搭建。在接下来的章节中,我们将深入探讨Spring Boot在定时任务方面的应用,展示如何利用其特性来构建高效、可靠的自动化任务。

第3部分:定时任务的基本概念

3.1 定时任务的定义

定时任务是一种在预定时间自动执行的代码片段或程序。它们可以是一次性的,也可以是周期性的,用于执行自动化任务,如数据备份、发送通知、执行定时检查等。

3.2 定时任务的类型
  • 一次性任务:仅执行一次,通常用于特定的初始化或清理操作。
  • 周期性任务:按照一定的时间间隔重复执行,可以是固定间隔或基于日历的时间。
3.3 定时任务的应用场景
  • 数据备份:定期备份数据库,确保数据安全。
  • 报告生成:定时生成业务报告,帮助决策制定。
  • 系统监控:周期性检查系统状态,及时发现并解决问题。
  • 用户通知:根据用户行为或特定事件发送提醒或通知。
3.4 定时任务的重要性

定时任务对于保持系统的正常运行和自动化业务流程至关重要。它们可以减少人工干预,提高效率,确保任务的及时性和准确性。

3.5 定时任务实现的挑战
  • 时间准确性:确保任务在预定时间准确执行。
  • 错误处理:妥善处理执行过程中可能出现的错误。
  • 资源管理:合理分配资源,避免任务执行时对系统性能的影响。
3.6 定时任务的实现方式
  • 操作系统层面:使用crontab或Windows任务计划程序。
  • 编程语言层面:使用特定语言的库或框架,如Java的java.util.Timer
  • 应用框架层面:使用框架提供的定时任务支持,如Spring的@Scheduled
3.7 示例:使用Java的java.util.Timer实现定时任务

下面是一个使用Java标准库中的Timer类实现的简单定时任务示例:

import java.util.Timer;
import java.util.TimerTask;

public class SimpleTimerTask {
    public static void main(String[] args) {
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                System.out.println("执行定时任务:" + System.currentTimeMillis());
            }
        };
        Timer timer = new Timer();
        long delay = 0;
        long intervalPeriod = 1000; // 间隔1秒执行一次
        timer.scheduleAtFixedRate(task, delay, intervalPeriod);
    }
}
3.8 示例:使用cron表达式

cron表达式是一种强大的用于配置定时任务执行时间的方式。以下是一个cron表达式的示例,表示每天凌晨1点执行任务:

0 0 1 * * ?
3.9 Spring Boot中的定时任务

Spring Boot通过@Scheduled注解简化了定时任务的配置和实现。下面是一个使用@Scheduled注解的Spring Boot定时任务示例:

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {
    
    @Scheduled(fixedRate = 5000) // 每5秒执行一次
    public void reportCurrentTime() {
        System.out.println("当前时间:" + System.currentTimeMillis());
    }
    
    @Scheduled(cron = "0 0 1 * * ?") // 每天凌晨1点执行
    public void scheduleTask() {
        System.out.println("执行定时任务:" + System.currentTimeMillis());
    }
}
3.10 定时任务的监控和管理
  • 日志记录:记录任务的执行情况,便于问题追踪和性能监控。
  • 健康检查:定期检查定时任务的健康状况,确保它们正常运行。

第4部分:Spring Boot中的定时任务实现

4.1 使用@Scheduled注解

@Scheduled是Spring提供的一个用于简化定时任务实现的注解。它允许你通过简单的注解配置来创建周期性执行的方法。

4.2 @Scheduled注解的配置
  • fixedRate:指定两次任务执行之间的固定时间间隔(单位为毫秒)。
  • fixedDelay:指定上一次任务执行结束与下一次任务开始之间的固定时间间隔。
  • initialDelay:指定任务首次执行前的延迟时间。
  • cron:使用cron表达式指定任务执行的时间表。
4.3 示例:使用fixedRate

以下示例展示了一个每5秒执行一次的方法:

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class FixedRateTask {

    @Scheduled(fixedRate = 5000)
    public void taskWithFixedRate() {
        System.out.println("任务执行:" + LocalDateTime.now());
    }
}
4.4 示例:使用fixedDelay

以下示例展示了一个在前一个任务执行结束后1秒执行的方法:

@Scheduled(fixedDelay = 1000)
public void taskWithFixedDelay() {
    System.out.println("任务执行:" + LocalDateTime.now());
}
4.5 示例:使用initialDelay

以下示例展示了一个在应用启动后10秒首次执行,之后每5秒执行一次的方法:

@Scheduled(initialDelay = 10000, fixedRate = 5000)
public void taskWithInitialDelay() {
    System.out.println("任务执行:" + LocalDateTime.now());
}
4.6 使用cron表达式

cron表达式提供了更复杂的时间设置,允许你指定具体的执行时间。以下示例展示了一个每天凌晨1点执行的方法:

@Scheduled(cron = "0 0 1 * * ?")
public void taskWithCronExpression() {
    System.out.println("任务执行:" + LocalDateTime.now());
}
4.7 处理任务执行异常

定时任务可能会抛出异常,Spring提供了@Async注解来异步执行任务,并使用@ExceptionHandler来处理异常。

@Async
@Scheduled(cron = "0 0/30 * * * ?")
public void taskWithExceptionHandling() {
    if (Math.random() > 0.5) {
        throw new RuntimeException("任务执行出错");
    }
    System.out.println("任务执行:" + LocalDateTime.now());
}
4.8 任务执行的线程池配置

Spring Boot允许你通过配置文件来自定义任务执行的线程池。

spring:
  task:
    scheduling:
      pool:
        size: 10
4.9 任务的动态修改

Spring Boot Actuator提供了端点来动态修改定时任务的执行计划。

curl -X POST http://localhost:8080/actuator/scheduledtasks/{taskName}/pause
4.10 示例:使用Spring Task Scheduler

对于更复杂的定时任务需求,可以使用Spring Task Scheduler。

import org.springframework.scheduling.config.ScheduledTaskRegistrar;

@Configuration
public class TaskSchedulerConfig {

    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(10);
        return taskScheduler;
    }

    @Autowired
    private TaskScheduler taskScheduler;

    @Autowired
    private ScheduledTasks scheduledTasks;

    @Bean
    public ScheduledExecutorService scheduledExecutor() {
        return new ScheduledThreadPoolExecutor(10);
    }

    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setTaskScheduler(taskScheduler);
        taskRegistrar.addFixedRateTask(scheduledTasks::taskWithFixedRate, 5000);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python】已解决:ValueError: Worksheet named ‘Sheet’ not found

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:ValueError: Worksheet named ‘Sheet’ not found 一、分析问题背景 在Python编程中,处理Excel文件是一个常见的任务。通常,我们会使用…

DFS之搜索顺序——AcWing 1116. 马走日

DFS之搜索顺序 定义 DFS之搜索顺序是指在执行深度优先搜索时,遍历图或树中节点的策略。具体而言,DFS会沿着一条路径深入到底,当无法继续深入时回溯,然后选择另一条未探索的路径继续深入。搜索顺序直接影响到搜索效率和剪枝的可能…

线性代数|机器学习-P21概率定义和Markov不等式

文章目录 1. 样本期望和方差1.1 样本期望 E ( X ) \mathrm{E}(X) E(X)1.2 样本期望 D ( X ) \mathrm{D}(X) D(X) 2. Markov 不等式&Chebyshev不等式2.1 Markov不等式公式 概述2.2 Markov不等式公式 证明:2.3 Markov不等式公式 举例:2.4 Chebyshev不…

HarmonyOS - 通过.p7b文件获取fingerprint

1、查询工程所对应的 .p7b 文件 通常新工程运行按照需要通过 DevEco Studio 的 Project Structure 勾选 Automatically generate signature 自动生成签名文件,自动生成的 .p7b 文件通常默认在系统用户目录下. 如:C:/Users/zhangsan/.ohos/config/default…

QT学习(6)——QT中的定时器事件,两种实现方式;事件的分发event,事件过滤器

目录 引出定时器事件QTimerEventQTimer 事件的分发事件过滤器 总结QT中的鼠标事件定义QLable的鼠标进入离开事件提升为myLabel重写QLabel的函数鼠标的事件鼠标的左中右键枚举鼠标多事件获取和鼠标移动鼠标追踪 QT中的信号和槽自定义信号和槽1.自定义信号2.自定义槽3.建立连接4.…

了解 PostgerSQL 的门户 – Executor vs Process Utility

当您向 PostgreSQL 发送查询时,查询会依次经历多个处理阶段,并在最后返回结果。这些阶段称为: 解析 分析 重写 计划 执行 在另一篇文章中,我简要概述了PostgreSQL在每个查询处理阶段的主要责任。你可以在这里找到它。 https…

SS8812T替代DRV8812的国产双通道H桥电机驱动芯片

由工采网代理的SS8812T是一款国产双通道H桥电机驱动芯片;该芯片为打印机和其它电机一体化应用提供一种双通道集成电机驱动方案;可Pin-to-Pin兼容替代DRV8812,可广泛应用于POS、打印机、安防相机、办公自动化设备、游戏机、机器人等。 产品描述…

14-8 小型语言模型的兴起

过去几年,我们看到人工智能能力呈爆炸式增长,其中很大一部分是由大型语言模型 (LLM) 的进步推动的。GPT-3 等模型包含 1750 亿个参数,已经展示了生成类似人类的文本、回答问题、总结文档等能力。然而,虽然 LLM 的能力令人印象深刻…

第14届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2022年8月21日真题

第14届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2022年8月21日真题 题目总数:5 总分数:128 更多真题下载点我👇https://pan.baidu.com/s/1JRLLwW2C-OBbcY2tJ3uYJg?pwd2wk2 编程题 第 1 题 问答题 编程实现&…

antd实现简易相册,zdppy+vue3+antd实现前后端分离相册

前端代码 <template><a-image:preview"{ visible: false }":width"200"src"http://localhost:8889/download/1.jpg"click"visible true"/><div style"display: none"><a-image-preview-group:previe…

【设计模式】设计模式学习线路与总结

文章目录 一. 设计原则与思想二. 设计模式与范式三. 设计模式进阶四. 项目实战 设计模式主要是为了改善代码质量&#xff0c;对代码的重用、解耦以及重构给了最佳实践&#xff0c;如下图是我们在掌握设计模式过程中需要掌握和思考的内容概览。 一. 设计原则与思想 面向对象编…

PMP--知识卡片--波士顿矩阵

文章目录 记忆黑话概念作用图示 记忆 一说到波士顿就联想到波士顿龙虾&#xff0c;所以波士顿矩阵跟动物有关&#xff0c;狗&#xff0c;牛。 黑话 你公司的现金牛业务&#xff0c;正在逐渐变成瘦狗&#xff0c;应尽快采取收割策略&#xff1b;问题业务的储备太少&#xff0…

AGI|Transformer自注意力机制超全扫盲攻略,建议收藏!

一、前言 2017年&#xff0c;谷歌团队推出一篇神经网络的论文&#xff0c;首次提出将“自注意力”机制引入深度学习中&#xff0c;这一机制可以根据输入数据各部分重要性的不同而分配不同的权重。当ChatGPT震惊世人时&#xff0c;Transformer也随之进入大众视野。一夜之间&…

【机器学习】连续字段的特征变换

介绍 除了离散变量的重编码外&#xff0c;有的时候我们也需要对连续变量进行转化&#xff0c;以提升模型表现或模型训练效率。在之前的内容中我们曾介绍了关于连续变量标准化和归一化的相关内容&#xff0c;对连续变量而言&#xff0c;标准化可以消除量纲影响并且加快梯度下降…

智能合约与企业数字化转型:案例分析与未来展望

随着区块链技术的快速发展&#xff0c;智能合约作为其重要应用之一&#xff0c;正逐渐成为推动企业数字化转型的关键工具。智能合约不仅可以自动执行和验证合同&#xff0c;还能够增强数据安全性、优化业务流程&#xff0c;并提升企业间的信任和透明度。本文将深入探讨智能合约…

CPU cache

参考&#xff1a;https://levelup.gitconnected.com/understanding-l1-l2-and-l3-caches-how-to-improve-cpu-performance-d9dcc3e2e1f5 2、以下部分&#xff1a;如何获取x86 CPU L1、L2和L3 cache的大小 - 知乎 (zhihu.com) CPU cache是介于CPU内核和物理内存&#xff08;动态…

ssm校园志愿服务信息系统-计算机毕业设计源码97697

摘 要 随着社会的进步和信息技术的发展&#xff0c;越来越多的学校开始重视志愿服务工作&#xff0c;通过组织各种志愿服务活动&#xff0c;让学生更好地了解社会、服务社会。然而&#xff0c;在实际操作中&#xff0c;志愿服务的组织和管理面临着诸多问题&#xff0c;如志愿者…

实战演练:Fail2Ban部署全攻略,确保您的服务器免受CVE-2024-6387侵害!

Fail2Ban是一个开源的入侵防护软件&#xff0c;它可以扫描日志文件&#xff0c;识别恶意行为&#xff08;如多次失败的登录尝试&#xff09;&#xff0c;并自动采取措施&#xff08;如更新防火墙规则&#xff09;来阻止攻击者。最近&#xff0c;CVE-2024-6387漏洞的爆出使我们更…

一分钟学习数据安全—自主管理身份SSI分布式加密密钥管理

在这篇之前&#xff0c;我们已经对SSI有了一个全局的了解。这个系列的文章可以作为一个学习笔记来参考&#xff0c;真正要实践其中的一些方案、协议&#xff0c;还需要参考专业的书籍和官方文档。作为一个SSI系列学习笔记的最后一篇&#xff0c;我们做一个简单的延伸&#xff0…

无服务器【Serverless】架构的深度剖析:组件介绍、优缺点与适用场景

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、云计算的发展趋势 2、无服务器计算简介 二、无服务…