Spring framework Day24:定时任务

news2024/11/19 16:20:01

前言

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

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

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

 一、开始学习

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

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
     */
    @Bean
    public ThreadPoolTaskScheduler taskScheduler() {
        // 创建定时任务线程池
        ThreadPoolTaskScheduler poolTaskScheduler = new ThreadPoolTaskScheduler();
        // 设置池的线程大小
        poolTaskScheduler.setPoolSize(10);
        // 设置线程名称的前缀
        poolTaskScheduler.setThreadNamePrefix("任务线程—");
        return poolTaskScheduler;

    }

    /**
     * 注册自定义的线程池
     *
     * @param taskRegistrar
     */
    @Override
    public 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.coloradmin.cn/o/1112259.html

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

相关文章

在中国,技术到底有多有用?

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 前言1.…

SpringBoot结合Druid实现SQL监控

1、前言 SpringBoot不用我多介绍了吧&#xff0c;目前后端最流行的框架。后端开发人员最基本的要求。 Druid数据库连接池&#xff0c;出自国内 ”java圣地" 阿里巴巴。 Druid是一个用于大数据实时查询和分析的高容错、高性能开源分布式系统&#xff0c;旨在快速处理大规模…

迅为RK3568开发板RTMP推流之视频监控

1 搭建 RTMP 媒流体服务器 nginx-rtmp 是一个基于 nginx 的 RTMP 服务模块&#xff0c;是一个功能强大的流媒体服务器模块&#xff0c; 它提供了丰富的功能和灵活的配置选项&#xff0c;适用于构建各种规模的流媒体平台和应用。无论是搭建实时视频直播平台、点播系统或多屏互…

【Qt】常见控件

文章目录 按钮组QListWidget列表容器TreeWidget树控件TableWidget 表格控件其它控件介绍下拉框QLabel显示图片和动图 自定义控件封装 按钮组 QPushButton 常用按钮 QToolButton 工具按钮&#xff1a; 用于显示图片 如果想显示文字&#xff1a;修改风格&#xff1a;toolButto…

分类预测 | MATLAB实现基于BiGRU-AdaBoost双向门控循环单元结合AdaBoost多输入分类预测

分类预测 | MATLAB实现基于BiGRU-AdaBoost双向门控循环单元结合AdaBoost多输入分类预测 目录 分类预测 | MATLAB实现基于BiGRU-AdaBoost双向门控循环单元结合AdaBoost多输入分类预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于BiGRU-AdaBoos…

Hadoop3教程(二十五):Yarn的多队列调度器使用案例

文章目录 &#xff08;136&#xff09;生产环境多队列创建&好处&#xff08;137&#xff09;容量调度器多队列提交案例如何创建多个队列如何向指定队列提交任务 &#xff08;138&#xff09;容量调度器任务优先级&#xff08;139&#xff09;公平调度器案例参考文献 &#…

【Java 进阶篇】JavaScript 表格全选案例详解

在网页开发中&#xff0c;表格&#xff08;Table&#xff09;是一种常用的HTML元素&#xff0c;用于以表格形式展示数据。对于包含大量数据的表格&#xff0c;提供一个全选复选框可以极大地提高用户体验&#xff0c;方便用户一次性选择或取消选择所有项目。本篇博客将详细介绍如…

Mac电脑版交互式原型设计软件 Axure RP 8汉化 for mac

Axure RP 8是一款专业快速原型设计软件&#xff0c;它主要用于定义需求、设计功能和界面等&#xff0c;适用于商业分析师、信息架构师、产品经理、IT咨询师、用户体验设计师、交互设计师和UI设计师等用户。 该软件可以快速、高效地创建原型&#xff0c;并支持多人协作设计和版…

彩虹云商城自助发卡商城-卡卡云主题

彩虹云商城自助发卡商城-卡卡云主题 全新SUP模板/知识付费模板/卡卡云模板&#xff0c;首页美化&#xff0c;登陆页美化修复了pc端显示不正常的问题。 将这俩个数据库文件导入数据库。 其他的直接导入网站根目录覆盖就好。 PS&#xff1a;若首页显示不正常&#xff1a;请去…

MYSQL学习笔记2-mysql数据文件

1.mysql数据文件类型&#xff1f;5.7和8的一些区别 创建一个anadb的数据库&#xff1a;在mysql安装目录下data目录下会产生一个同名的文件夹 建表&#xff1a;图为mysql57的数据文件图&#xff0c;不同的引擎建表会产生不同后缀名的文件 &#xff0c;mysql5.5以上默认使用 inno…

新手指南|如何快速参与Moonbeam Ignite

Moonbeam Ignite是社区熟悉的有奖链上交互活动&#xff0c;将有300万枚GLMR作为生态激励注入Moonbeam生态系统&#xff0c;体验MoonbeamMoonbeam生态的应用即可获取相应Token奖励。Beamex/Beamswap、Moonwell和Gamma作为首批参与Moonbeam Ignite的三家项目方&#xff0c;将在活…

机器学习(23)---Boosting tree(课堂笔记)

文章目录 一、知识记录二、题目2.1 题目12.2 题目22.3 答案书写 一、知识记录 二、题目 2.1 题目1 2.2 题目2 2.3 答案书写

一百九十一、Flume——Flume配置文件各参数含义(持续完善中)

一、目的 在实际项目的开发过程中&#xff0c;不同Kafka主题的数据规模、数据频率&#xff0c;需要配置不同的Flume参数&#xff0c;而这一切的调试、配置工作&#xff0c;都要建立在对Flume配置文件各参数含义的基础上 二、Flume各参数及其含义 &#xff08;一&#xff09;…

touch - 创建空文件与修改时间戳

touch命令的功能是用于创建空文件与修改时间戳。如果文件不存在&#xff0c;则会创建出一个空内容的文本文件&#xff1b;如果文件已经存在&#xff0c;则会对文件的Atime&#xff08;访问时间&#xff09;和Ctime&#xff08;修改时间&#xff09;进行修改操作&#xff0c;管理…

数字秒表设计仿真VHDL跑表,源码,视频

名称&#xff1a;简单秒表设计仿真VHDL跑表 软件&#xff1a;Quartus 语言&#xff1a;VHDL 代码功能&#xff1a; 数字秒表功能描述 本次练习只需要一个数码管(假设该数码管已被选中),实现数码管显示功能,具体要求如下(设数码管为共阳&#xff09; 1)实现秒表计时功能。…

阿里云安装 redis

1、在opt目录下面安装redis https://download.redis.io/redis-stable.tar.gz redis的最新稳定版本。更多版本可见 redis cd /opt wget https://download.redis.io/redis-stable.tar.gz2、解压tar包&#xff0c;会生成redis-stable文件夹 tar -xzvf redis-stable.tar.gz3、安装…

NLP Bi-Encoder和Re-ranker

Retrieve & Re-Rank https://www.sbert.net/examples/applications/retrieve_rerank/README.html Bi-Encoder vs. Cross-Encoder https://www.sbert.net/examples/applications/cross-encoder/README.html Bi-Encoder会用BERT对输入文本编码&#xff0c;再根据cosine相似度…

JAVAEE初阶相关内容第十五弹--网络編程

写在前 简单描述一下关于路由器的三层转发和交换机的二层转发。 路由器是三层转发-->在网络层转发。【需要解析出IP协议中的源IP、目的IP来规划路径】 交换机是二层转发-->在数据链路层转发。【只需要关注下一步发展到哪个相邻的设备上&#xff0c;不需要IP地址&#…

人工智能发展与结构科学

人工智能&#xff08;AI&#xff09;在各种应用中的影响力不断增强&#xff0c;从简单的计算任务到复杂的决策支持。但在这背后&#xff0c;AI的发展其实是一个关于结构演变的故事。从最早的线性结构&#xff0c;到今天的复杂网络结构&#xff0c;结构的演变对AI的能力和效率产…

【离线/并查集】CF1213 G

想起来好久没写题解了&#xff0c;随便写一下把 感觉写多了div3后面的题就变得简单了&#xff0c;div3似乎没什么思维含量&#xff0c;甚至有时候能开出div3的2100.... 心血来潮写一下这个*1800的题解&#xff0c;思路一下就出了&#xff0c;但是一开始多了个log被卡了&#x…