Spring framework Day24:定时任务

前言

在我们的日常生活和工作中,时间管理是一项至关重要的技能。随着各种复杂任务的增加和时间压力的不断增加,如何更好地分配和利用时间成为了一项迫切需要解决的问题。在这样的背景下,定时任务成为了一种非常有效的解决方案。

定时任务,顾名思义,即按照预定的时间点或时间间隔定期执行指定的任务。它可以帮助我们自动化一些重复性的、繁琐的工作,从而节省时间和精力,提高效率。

本文将介绍定时任务的基本概念、应用场景以及如何使用定时任务来优化我们的生活和工作。

 一、开始学习

本次案例以一个简单的下单操作进行讲解!

1、新建任务,结构如下

2、添加 spring 依赖
 <!-- spring 的核心依赖 --><dependencies><!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.23</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.4.5</version></dependency></dependencies>
3、在 service 包下新建一个 OrderService 类
@Service
@Slf4j
public class OrderService {public void backup(){log.info("备份订单");}}

 这是一个简单的Java类,名为OrderService。该类使用了两个注解:@Service和@Slf4j。

@Service注解用于标识该类为Spring的服务组件,可以被自动注入到其他需要调用该服务的类中。

@Slf4j注解是Lombok提供的一个注解,在编译期间会自动生成一个名为log的日志对象,主要是为了输出方法中的 “备份订单”。

在该类中,有一个名为backup的方法。该方法用于备份订单,并在控制台输出一条日志记录。通过使用@Slf4j注解,我们可以方便地使用log对象输出日志信息。

4、在 config 包下新建一个配置类 AppConfig

@Configuration
@ComponentScan(basePackages = "edu.nf.ch24")
// 启用定时任务注解处理器
@EnableScheduling
public class AppConfig implements SchedulingConfigurer {/*** 装配一个自定义的定时任务线程** @return*/@Beanpublic ThreadPoolTaskScheduler taskScheduler() {// 创建定时任务线程池ThreadPoolTaskScheduler poolTaskScheduler = new ThreadPoolTaskScheduler();// 设置池的线程大小poolTaskScheduler.setPoolSize(10);// 设置线程名称的前缀poolTaskScheduler.setThreadNamePrefix("任务线程—");return poolTaskScheduler;}/*** 注册自定义的线程池** @param taskRegistrar*/@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {// 注册定时任务线程池taskRegistrar.setTaskScheduler(taskScheduler());}
}

 其中使用了 @ComponentScan 注解来指定扫描的基础包路径为 edu.nf.ch24,并通过 @EnableScheduling 启用了定时任务的注解处理器。

此外,在 AppConfig 中实现了 SchedulingConfigurer 接口,并重写了 configureTasks 方法。在该方法中,通过 taskRegistrar.setTaskScheduler(taskScheduler()) 注册了一个自定义的定时任务线程池,使用 taskScheduler() 方法创建了一个 ThreadPoolTaskScheduler 对象,并设置了线程池的大小为 10,线程名称的前缀为 "任务线程—"。

最终,我们可以通过将 AppConfig 作为配置类传递给 Spring 容器来启动应用程序,并在 edu.nf.ch24 包下的定时任务相关类中使用注解来定义定时任务,由定时任务注解处理器负责创建相应的定时任务并在指定的时间执行。

这个类 AppConfig 的作用是用来配置 Spring 容器的,具体来说,它定义了一个名为 taskScheduler 的 Bean,并将其注册到 Spring 容器中。这个 Bean 是一个定时任务线程池,用来执行我们在应用程序中定义的定时任务。

通过 @Bean 注解和 taskScheduler() 方法定义了一个 ThreadPoolTaskScheduler 对象,并对其进行一些属性的配置,如设置线程池大小和线程名称前缀等。然后,在 configureTasks 方法中将 taskScheduler 注册到了 taskRegistrar 中,以便在应用程序中使用。

另外,通过 @ComponentScan(basePackages = "edu.nf.ch24") 注解指定了需要扫描的基础包路径为 edu.nf.ch24,这样 Spring 容器就能够找到该路径下定义的所有 Bean,并进行相应的管理和注入。

最后,通过 @EnableScheduling 注解启用了 Spring 的定时任务注解处理器,使得我们可以在应用程序中使用注解来定义定时任务,而不需要手动编写定时任务的相关代码,从而提高了开发效率。

5、在 task 包下新建一个 OrderTask 类

/*** @Date 2023-10-13* @Author qiu* 订单定时器,定时触发*/
@Component
@RequiredArgsConstructor
public class OrderTask {public final OrderService orderService;/*** 定时任务方法* 使用 @Scheduled 注解标注当前方法为一个定时任务方法* 并且使用 cron 表达式来设定执行的时间*/@Scheduled(cron = "0/5 * * * * ?")public void executeBackup() {orderService.backup();}}

 这是一个订单定时器类 OrderTask,用来执行一些定时任务。它使用了 @Component 注解将其标记为 Spring 容器中的组件,在应用程序启动时会由 Spring 自动扫描并加载。

该类通过构造函数注入了一个 OrderService 实例,用来执行一些具体操作。注意到它的构造函数使用了 @RequiredArgsConstructor 注解,该注解是 Lombok 库提供的,可以帮助我们自动生成一个包含所有成员变量的构造函数,避免了手写构造函数的繁琐。

OrderTask 类中,定义了一个名为 executeBackup() 的方法,使用了 @Scheduled(cron = "0/5 * * * * ?") 注解,表示该方法是一个定时任务,并且它将在 Cron 表达式 "0/5 * * * * ?" 指定的时刻执行。具体来说,该表达式表示每隔 5 秒钟执行一次。

executeBackup() 方法中,调用了 orderService.backup() 方法,该方法用于执行一些备份操作。

总之,这个类用于定义一个周期性执行的定时任务,它依赖于 OrderService 并使用了 Spring 的定时任务注解 @Scheduled。当定时任务启动后,它将会间隔一定时间执行 orderService.backup() 方法,用于进行一些数据备份操作。

 来讲一下 Cron 表达式:

Cron 表达式是一种用于指定时间的字符串表达式,通常用来表示定时任务的执行时间。Cron 表达式由 6 或 7 个字段组成,每个字段之间用空格分隔,其格式如下:

<秒> <分> <时> <日> <月> <周> [年]

其中, 是必需的字段,它们分别表示秒、分、小时、日期、月份和星期。每个字段可以是一个具体值、一个范围、一个列表或者一个通配符。

以下是一些常用的 Cron 表达式示例:

  • "0 * * * * ?" 表示每个整分钟触发一次。
  • "0/5 * * * * ?" 表示每隔 5 秒钟触发一次。
  • "0 0/15 8-20 * * ?" 表示每天上午 8 点到晚上 8 点之间,每隔 15 分钟触发一次。
  • "0 0 12 ? * WED" 表示每个星期三的中午 12 点触发一次。
  • "0 0 10,14,16 * * ?" 表示每天上午 10 点、下午 2 点和下午 4 点各触发一次。
  • "0 0/30 9-17 * * MON-FRI" 表示每个工作日上午 9 点到下午 5 点之间,每隔 30 分钟触发一次。

还有一些特殊符号也可以用来表示 Cron 表达式:

  • * 表示所有可能的值。
  • - 表示一个范围。
  • , 表示多个值,用逗号隔开。
  • / 表示增量,如 0/5 表示从 0 开始,每隔 5 秒一次。
  • ? 表示未指定的值,用于日和星期字段。如果日和星期都未指定,则表示每天都触发一次。
  • # 表示某个月份的第几个星期几,如 2#1 表示每个月的第一个周一。

Cron 表达式非常灵活,可以根据不同的场景自由组合。但是需要注意的是,应该避免使用过于复杂的表达式,以免造成混淆和误解。

 6、测试
public class Main {public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);}}

运行结果

只要执行了这个程序,初始化容器后就会启动AppConfig的注解,定时任务就是开启了。

 

二、使用定时任务有什么好处

使用定时任务有以下几个好处:

  1. 自动化执行:通过设置定时任务,可以让程序自动按计划执行,无需手动干预。这能够提高系统的可靠性和稳定性,避免人为错误或遗漏。

  2. 提高效率:定时任务可以在后台自动执行重复性的、耗时的操作,如数据备份、日志清理、报表生成等,从而释放人力资源,提高工作效率。

  3. 实时性和准确性:通过定时任务,可以及时地处理一些需要在特定时间点触发的事件,如发送定时通知、更新缓存、执行数据同步等,保证操作的实时性和准确性。

  4. 节省资源:定时任务可以在非高峰期执行一些资源密集型的操作,以避免对正常业务操作的影响。例如,在低访问量的时段执行数据库维护操作,或在夜间执行数据清理操作,以充分利用系统资源。

  5. 延迟执行:一些任务可能需要在未来的某个时间点触发,而不是立即执行。通过定时任务,可以预先设置好任务的执行时间,以满足特定的业务需求。

总的来说,使用定时任务可以提高系统的自动化程度,降低人工干预的需求,提高工作效率和系统可靠性,同时能够实现一些特定的业务需求,提供更好的用户体验。

三、gitee 案例

案例完整地址:https://gitee.com/qiu-feng1/spring-framework.git

 

 

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

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

相关文章

Kubernetes技术与架构-服务

从软件系统架构设计分层的角度看&#xff0c;Kubernetes的Service是基于Pod的上层&#xff0c;业务应用部署在Pod中&#xff0c;使用Service绑定Pod部署的应用&#xff0c;Service可以对外或者对上层提供服务&#xff0c;当Pod集群在系统调度的过程中发生弹性伸缩的时候&#x…

Python中的With ...as... 作用

Python中的with … as …作用&#xff1a; 1、通过with语句可以得到一个上下文管理器 2、执行对象 3、加载__enter__方法 4、加载__exit__方法 5、执行__enter__方法 6、as 可以得到enter的返回值 7、拿到对象执行相关操作 8、执行完了之后调用__exit__方法 9、如果遇到异常&a…

1024程序员节特辑 | ELK+ 用户画像构建个性化推荐引擎,智能实现“千人千面”

专栏集锦&#xff0c;赶紧收藏以备不时之需 Spring Cloud实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏&#xff1a;https://blog.…

易点易动上线招标管理模块:提升企业高效招标管理的解决方案

在当今竞争激烈的商业环境下&#xff0c;招标管理对于企业的成功至关重要。为了帮助企业实现高效的招标管理&#xff0c;易点易动固定资产管理系统上线了全新的招标管理模块。该模块涵盖了供应商资质审核、采购询价单、重新报价单、招标结果单、招标作废单等功能&#xff0c;为…

python爬虫采集企查查数据

企查查&#xff0c;一个查询企业信息的网站&#xff0c;这个网站也是网络爬虫选择采集的对象&#xff0c;这个网站反爬提别厉害&#xff0c;没有一定的爬虫技术&#xff0c;是无法采集成功的。 网络爬虫从企查查采集企业信息&#xff0c;如果想要看到完成的企业信息就需要登录后…

Python 爬虫实战之爬拼多多商品并做数据分析

Python爬虫可以用来抓取拼多多商品数据&#xff0c;并对这些数据进行数据分析。以下是一个简单的示例&#xff0c;演示如何使用Python爬取拼多多商品数据并进行数据分析。 首先&#xff0c;需要使用Python的requests库和BeautifulSoup库来抓取拼多多商品页面。以下是一个简单的…

10月份stable diffusion animatediff等插件使用指南,又来更新了

插件一直会更新&#xff0c;包含了基本市面上流行的90%插件&#xff0c;好用的插件更是不会错过&#xff0c;往期插件请看往期文章&#xff0c;如果你没有时间一直关注sd更新的进展&#xff0c;请关注我&#xff0c;一个月用几个小时看一下我的文章&#xff0c;最短时间跟进sd。…

【微服务】spring webflux响应式编程使用详解

目录 一、webflux介绍 1.1 什么是webflux 1.2 什么是响应式编程 1.3 webflux特点 二、Java9中响应式编程 2.1 定义事件流源 2.2 实现订阅者 三、Spring Webflux介绍 四、Reactor 介绍 五、Reactor 常用API操作 5.1 Flux 创建流操作API 5.2 Flux响应流的订阅 5.3 Fl…

Mybatis对数据库进行增删查改以及单元测试

这篇写的草率了&#xff0c;是好几天前学到&#xff0c;以后用来自己复习 UserInfo import lombok.Data;Data public class UserInfo {private int id;private String name;private int age;private String email;//LocalDateTime可用于接收 时间}Mapper UserMapper pack…

软考 系统架构设计师系列知识点之软件构件(1)

所属章节&#xff1a; 第2章. 计算机系统基础知识 第3节. 计算机软件 2.3.7 软件构件 1. 概述 构件又称为组件&#xff0c;是一个自包容、可复用的程序集。构建是一个程序集、或者说是一组程序的集合。这个集合可能会以各种方式体现出来&#xff0c;如源程序或二进制代码。这…

2023年中国多功能折叠刀产量、销量及市场规模分析[图]

多功能折叠刀是一种集多种功能于一身的刀具&#xff0c;通常包括切割、开瓶、剥皮、锯木等功能&#xff0c;可以通过折叠和展开的方式来实现不同的功能&#xff0c;具有便携、多用途、安全等特点&#xff0c;广泛应用于户外探险、露营、自驾旅行等场景。 多功能折叠刀行业分类…

Simian使用方法

1.下载 链接1&#xff1a;官网下载 链接2&#xff1a;压缩包 2.操作 1.双击exe启动 2.打开控制台&#xff0c;winR 输入cmd 3.输入操作语句 G:\1111\simian-2.5.10\bin\simian-2.5.10.exe -includes"G:\1111\test\*.cpp" -threshold3 > output.txt G:\1111\si…

利用TypeScript 和 jsdom 库实现自动化抓取数据

以下是一个使用 TypeScript 和 jsdom 库的下载器程序&#xff0c;用于下载zhihu的内容。此程序使用了 duoip.cn/get_proxy 这段代码。 import { JSDOM } from jsdom; import { getProxy } from https://www.duoip.cn/get_proxy;const zhihuUrl https://www.zhihu.com;(async (…

璞华科技再次赋能,助力成都市温江区“码”上维权不烦“薪” !

科技赋能护“薪”行动 “码”上维权不烦“薪” 为保障劳动者工资收入的合法权益&#xff0c;提升人社部门智能化咨询服务能力&#xff0c;2023年10月17日&#xff0c;成都市温江区人力资源和社会保障局发布“码上护薪”小程序&#xff0c;助力劳动者“码”上维权不烦”薪”。…

【Machine Learning】01-Supervised learning

01-Supervised learning 1. 机器学习入门1.1 What is Machine Learning?1.2 Supervised learning1.3 Unsupervised learning 2. Supervised learning2.1 单元线性回归模型2.1.1 Linear Regression Model&#xff08;线性回归模型&#xff09;2.1.2 Cost Function&#xff08;代…

学习编程语言需要熟悉库函数吗?

学习编程语言需要熟悉库函数吗? 我想答案肯定是需要的。 但不是盲目的挨个去记&#xff0c;几乎各个语言的库函数都极为丰富&#xff0c;逐个记忆的话是十分劝退的&#xff0c;而且也不可能全部熟悉&#xff0c;到用的时候该忘还是忘。最近很多小伙伴找我&#xff0c;说想要一…

AArch64 TrustZone

概述 本文我们介绍了 TrustZone 技术。通过CPU内置的硬件强制隔离&#xff0c;TrustZone 提供了一种高效的全系统安全设计。 我们介绍了如下功能&#xff1a;将 TrustZone 技术添加到处理器架构中&#xff0c;内存系统对于 TrustZone 的支持以及典型的软件架构。我们还介绍了…

利用MixProxy自动录制生成Pytest案例:轻松实现测试脚本编写!

前言 进行接口自动化时&#xff0c;有时候往往没有接口文档&#xff0c;或者文档更新并不及时&#xff0c;此时&#xff0c;想要获取相关接口&#xff0c;通过抓包是一种快速便捷的手段。抓包获取到接口后&#xff0c;开始写接口用例&#xff0c;此时需要复制请求url、请求参数…

React拖拽实践

当涉及到前端开发中的用户体验时&#xff0c;拖拽功能是一个常见而重要的需求。在React中&#xff0c;实现拖拽功能可以通过多种方式完成&#xff0c;但通常需要深刻理解React的状态管理、事件处理和DOM操作。本文将探讨React中拖拽的实践&#xff0c;包括基本原理、拖拽库的使…

Flutter 填坑录 (不定时更新)

一&#xff0c;内存爆表 > 图片缓存 /// State基类 class BaseState<T extends StatefulWidget> extends State<T>withAutomaticKeepAliveClientMixin,WidgetHelper,DialogHelper,EventListener {mustCallSupervoid initState() {if (isListenEvent()) {EventMa…