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() {@Overridepublic 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 {@Beanpublic TaskScheduler taskScheduler() {ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();taskScheduler.setPoolSize(10);return taskScheduler;}@Autowiredprivate TaskScheduler taskScheduler;@Autowiredprivate ScheduledTasks scheduledTasks;@Beanpublic ScheduledExecutorService scheduledExecutor() {return new ScheduledThreadPoolExecutor(10);}public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {taskRegistrar.setTaskScheduler(taskScheduler);taskRegistrar.addFixedRateTask(scheduledTasks::taskWithFixedRate, 5000);}
}

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

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

相关文章

Deep Filtered Back Projection for CT Reconstruction

CT重建中的深度滤波反投影 论文链接:https://ieeexplore.ieee.org/document/10411896 项目链接: ABSTRACT 滤波反投影(FBP)是一种经典的计算机断层扫描(CT)重建解析算法,具有很高的计算效率。然而,用FBP重建的图像往往存在过多…

NATAPP内网穿透使用

1. natapp能干嘛 可以将本地的内网ip映射到外网上,远程访问该连接,实现外网展示网站。平时做的应用开发都只能在局域网本地访问,通过内网穿透,可以通过外网进行访问。 2. 注册用户 网址:https://natapp.cn/自行完成…

什么是 Elasticsearch 数据预热?

引言:在现代的信息检索和数据分析领域,Elasticsearch 已经成为一个广泛应用的分布式搜索和分析引擎。作为开源项目的一部分,Elasticsearch 提供了强大的实时搜索和分析能力,使得处理大规模数据变得更加高效和可靠。然而&#xff0…

Canary,三种优雅姿势绕过

Canary(金丝雀),栈溢出保护 canary保护是防止栈溢出的一种措施,其在调用函数时,在栈帧的上方放入一个随机值 ,绕过canary时首先需要泄漏这个随机值,然后再钩爪ROP链时将其作为垃圾数据写入&…

对接海康sdk-linux下复制jar包中resource目录的文件夹

背景 在集成海康sdk时,需要将一些组件放到项目中作为静态资源,并且海康的sdk初始化也需要加载这些静态资源,在windows下,使用一些File路径的方式是可以正确加载的,但是在linux上就会加载失败。 首先我是将海康的sdk组件放到resource下的,并且按照windows和linux设置了两…

轻松快速上手Thekey库,实现数据加密无忧

Thekey的概述: Thekey库是一个Python库,旨在简化数据加密、解密、签名和验证的过程。它提供了一套简洁易用的接口,用于处理各种加密任务,适合需要在应用程序中实现安全数据处理的开发人员. 安装Thekey库 pip install thekey使用Thekey库进行基本加密和解密操作的…

【笔记】TimEP Safety Mechanisms方法论

1.TimEPM Overview 三大监控方法: Alive Supervision 实时监督Logical Supervision 逻辑监督Deadline Supervision 限时监督相关模块框图: 相关模块调用框图: 每个MCU核开启内狗(1核1狗),内狗用于监控相应核的TASK超时,超时后软reset MCU内狗时钟需要独立于OS时钟,两…

C++下Protobuf学习

C下Protobuf简单学习 Protobuf(Protocol Buffers)协议是一种由 Google 开发的高效的、跨语言的、平台无关的数据序列化协议,提供二进制序列化格式和相关的技术,它用于高效地序列化和反序列化结构化数据,通常用于网络通…

遗传算法详解

一、遗传算法的概述 1. 定义与简介 遗传算法(Genetic Algorithm, GA)是一种基于自然选择和遗传机制的搜索算法,最早由美国学者John Holland在20世纪70年代提出。遗传算法模拟自然界的进化过程,通过选择、交叉和变异等操作&#…

《uTools:提升效率的神奇工具》

utools5.0 一、引言 在如今快节奏的工作和生活中,我们都在寻找能够帮助我们节省时间、提高效率的工具。uTools 就是这样一款令人惊艳的工具,它为我的日常带来了极大的便利。 二、uTools 的强大功能 快捷搜索 只需一个快捷键,就能快速搜索本…

DDR3(三)

目录 1 预取1.1 什么是预取1.2 预取有哪些好处1.3 结构框图1.4 总结 2 突发2.1 什么是突发2.2 突发与预取 本文讲解DDR中常见的两个术语:预取和突发,对这两个概念理解的关键在于地址线的低位是否参与译码,具体内容请继续往下看。 1 预取 1.1…

速盾:cdn转发ip

CDN转发IP,简称CDN IP,是指CDN服务商将用户请求转发到最近的CDN节点后,再由该节点代理发出请求到用户真实IP的一种技术手段。 随着互联网的发展,网站访问量和用户需求不断增加,为了提高网站的访问速度和稳定性&#x…

JDBC【封装工具类、SQL注入问题】

day54 JDBC 封装工具类01 创建配置文件 DBConfig.properties driverNamecom.mysql.cj.jdbc.Driver urljdbc:mysql://localhost:3306/qnz01?characterEncodingutf8&serverTimezoneUTC usernameroot passwordroot新建配置文件,不用写后缀名 创建工具类 将变…

C++笔试强训2

文章目录 一、选择题二、编程题 一、选择题 和笔试强训1的知识点考的一样,因为输出的是double类型所以后缀为f,m.n对其30个字符所以m是30,精度是4所以n是4,不加符号默认是右对齐,左对齐的话前面加-号,所以答案是-30.4f…

推荐Bulk Image Downloader插件下载网页中图片链接很好用

推荐:Bulk Image Downloader chome浏览器插件下载图片链接,很好用。 有个网页,上面放了数千的gif的电路图,手工下载会累瘫了不可。想找一个工具分析它的静态链接并下载,找了很多推荐的下载工具,都是不能分…

vue2 data内对象引用另一个data对象无法使用this的解决办法

背景:data内有一复杂对象,并且内部一属性经常修改,每次修改的话属性.属性会很长,所以希望引用另一简单对象,但data内this用不了。(集合数组是地址引用,基本数据类型这么操作没意义) 如: 解决办法…

数字信号处理及MATLAB仿真(3)——采样与量化

今天写主要来编的程序就是咱们AD变换的两个步骤。一个是采样,还有一个是量化。大家可以先看看,这一过程当中的信号是如何变化的。信号的变换图如下。 先说说采样,采样是将连续时间信号转换为离散时间信号的过程。在采样过程中,连续…

进程的控制-孤儿进程和僵尸进程

孤儿进程 : 一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被 init 进程( 进程号为 1) 所收养,并由 init 进程对它们完成状态收集工作 为了释放子进程的占用的系统资源: …

解决Linux环境Qt报“cannot find -lgl“问题

今天,在Ubuntu 18.04.6环境下,安装Qt5.14.2之后,运行一个QWidget工程,发现Qt报"cannot find -lgl"错误。     出现这种现象的原因:Qt的Path路径没有配置,缺少libqt4-dev依赖包和一些必要的组件…

拉曼光谱入门:2.拉曼光谱发展史、拉曼效应与试样温度的确定方法

1.拉曼光谱技术发展史 这里用简单的箭头与关键字来概括一下拉曼光谱技术的发展史 1928年:拉曼效应的发现 → 拉曼光谱术的初步应用20世纪40年代:红外光谱术的发展 → 拉曼光谱术的限制20世纪60年代:激光作为光源的引入 → 拉曼光谱术的性能提…