spring task使用

news2025/1/11 20:17:09

Spring Task 简介

Spring Task 是 Spring 框架原生自带的任务调度框架,它犹如一把瑞士军刀,为开发者提供了丰富多样的功能,助力轻松创建和管理定时任务。相较于其他一些第三方任务调度框架,Spring Task 最大的优势在于其与 Spring 生态系统的无缝集成。这意味着开发者能够在 Spring 应用中自如地运用依赖注入、事务管理等强大特性,使得代码的编写过程更加流畅,后期维护也更为便捷。例如,在一个电商系统中,我们可以利用 Spring Task 定时更新商品库存信息,同时借助依赖注入获取商品服务层的实例,实现业务逻辑的高效处理。

添加依赖

非 Spring Boot 的 Spring 项目中,需要添加 spring-context 依赖:

Spring Boot 项目中无需添加依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
</dependency>

开启定时任务

若要在 Spring 项目中启用定时任务功能,首要步骤是在配置类或主启动类上添加@EnableScheduling注解。

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;

@Configuration
@EnableScheduling
public class AppConfig {
    // 配置类中的其他配置,如数据源配置、Bean的定义等
}

在上述代码中,AppConfig类通过添加@Configuration注解表明这是一个配置类,而@EnableScheduling注解则通知 Spring 容器开始扫描并注册所有带有定时任务注解的方法,为后续的定时任务执行做好准备。

基于 Spring Boot 主启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

对于 Spring Boot 项目,在主启动类Application上添加@SpringBootApplication注解,它整合了@Configuration、@EnableAutoConfiguration和@ComponentScan等多个注解的功能,而@EnableScheduling注解的加入则开启了定时任务的支持。当应用启动时,Spring 容器会自动扫描整个项目,识别并注册符合条件的定时任务。

添加了这个注解后,Spring 容器就如同一个敏锐的观察者,会自动扫描并注册所有带有定时任务注解的方法,为后续定时任务的执行搭建好了舞台。

@Scheduled 注解实现定时任务

在 Spring Task 的工具库中,最常用的定时任务定义方式当属使用@Scheduled注解。我们只需将这个注解添加到想要定时执行的方法上,Spring 就会严格按照我们指定的规则,如同忠诚的守护者一般,在合适的时间点准时调用这个方法。

例如,创建一个简单的定时任务,每隔 5 秒输出一条日志,记录系统的运行状态,代码如下:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class SimpleTask {
    private static final Logger logger = LoggerFactory.getLogger(SimpleTask.class);

    @Scheduled(fixedRate = 5000)
    public void executeTask() {
        logger.info("定时任务执行了!当前时间为:{}", System.currentTimeMillis());
    }
}

在上述代码中,@Scheduled(fixedRate = 5000)表示这个方法会以固定的速率执行,每 5000 毫秒(即 5 秒)执行一次。每次任务执行时,都会在日志中记录下 “定时任务执行了!” 以及当前的时间戳,方便开发者追踪任务的执行情况。

执行策略

cron 表达式

cron表达式堪称任务执行时间定义的魔法咒语,它以一种极为灵活且强大的方式来精准控制任务的执行时间。它由 6 或 7 个空格分隔的时间字段组成,从左到右分别表示秒、分、时、日、月、周以及年(年字段为可选)。

例如,要在每天的凌晨 2 点整执行任务,对数据库进行日常备份,确保数据的完整性,配置如下:

@Scheduled(cron = "0 0 2 * * *")
public void dailyTask() {
    // 数据库备份逻辑,例如调用数据库备份工具或执行SQL语句
}

 

下面是一些常用的cron表达式示例,帮助开发者更好地理解和运用:

  • 0 0 12 * *?:每天中午 12 点整执行,适用于在中午进行数据统计或报表生成的场景。
  • 0 15 10 * *?:每天上午 10 点 15 分执行,可用于在工作时间开始时更新系统数据或发送通知。
  • 0 0/5 * * *?:每隔 5 分钟执行一次,常用于实时数据监控或缓存更新的场景。

fixedDelay

fixedDelay表示上一次任务执行完毕后,间隔指定的时间再执行下一次任务。例如,设置fixedDelay = 3000,意味着上一次任务执行完成后,系统会耐心等待 3 秒,然后再启动下一次任务。这种策略适用于任务执行时间不固定,但希望每次执行之间有一定间隔的场景,比如在数据采集任务中,每次采集完成后,需要一定时间处理数据,处理完后再进行下一次采集。

@Scheduled(fixedDelay = 3000)
public void taskWithFixedDelay() {
    // 数据采集或其他任务执行逻辑
}

 

fixedRate

fixedRate表示按照固定的时间间隔执行任务,无论上一次任务是否执行完毕。例如,设置fixedRate = 5000,表示每隔 5 秒就会启动一次任务,如同一个精准的时钟,不管前一次任务的状态如何,都会按时触发下一次任务。这种策略适用于需要持续周期性执行的任务,比如定时向服务器发送心跳包以保持连接。

@Scheduled(fixedRate = 5000)
public void taskWithFixedRate() {
    // 发送心跳包或其他周期性任务执行逻辑
}

initialDelay

initialDelay用于指定在应用启动后,延迟多长时间再执行第一次任务。它通常与fixedRate或fixedDelay一起使用,为任务的首次执行提供了灵活的控制。

例如,应用启动后延迟 2 秒,然后每隔 5 秒执行一次任务,可用于在系统初始化完成后,再开始执行周期性任务。

@Scheduled(initialDelay = 2000, fixedRate = 5000)
public void taskWithInitialDelay() {
    // 系统初始化后的周期性任务执行逻辑
}

异步使用

在某些复杂的业务场景下,我们可能期望定时任务能够异步执行,避免阻塞主线程,确保系统的高并发性能和响应速度。Spring Task 充分考虑到了这一需求,提供了完善的异步执行支持。

首先,需要在配置类中启用异步任务支持,添加@EnableAsync注解:

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;

@Configuration
@EnableScheduling
@EnableAsync
public class AppConfig {
    // 配置类中的其他配置,如线程池配置等
}

 

在上述代码中,@EnableAsync注解告诉 Spring 容器开启异步任务的功能,允许方法在独立的线程中执行。同时,我们还可以在配置类中进一步配置线程池的参数,如线程池的大小、最大线程数等,以优化异步任务的执行效率。

然后,在需要异步执行的定时任务方法所在的类上添加@Async注解:

 

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

@Component
@Async
public class AsyncTask {
    @Scheduled(fixedRate = 5000)
    public void asyncExecuteTask() {
        // 异步任务执行逻辑,例如调用远程服务或进行复杂计算
    }
}

当asyncExecuteTask方法被调用时,它会在一个单独的线程池中执行,如同在后台默默工作的助手,不会干扰主线程的正常运行,从而确保系统在处理定时任务的同时,能够高效地响应其他用户请求。

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

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

相关文章

nexus搭建maven私服

说到maven私服每个公司都有&#xff0c;比如我上一篇文章介绍的自定义日志starter&#xff0c;就可以上传到maven私服供大家使用&#xff0c;每次更新只需deploy一下就行&#xff0c;以下就是本人搭建私服的步骤 使用docker安装nexus #拉取镜像 docker pull sonatype/nexus3:…

MiniMind - 从0训练语言模型

文章目录 一、关于 MiniMind &#x1f4cc;项目包含 二、&#x1f4cc; Environment三、&#x1f4cc; Quick Start Test四、&#x1f4cc; Quick Start Train0、克隆项目代码1、环境安装2、如果你需要自己训练3、测试模型推理效果 五、&#x1f4cc; Data sources1、分词器&am…

Postman接口测试基本操作

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Postman-获取验证码 需求&#xff1a;使用Postman访问验证码接口&#xff0c;并查看响应结果。 地址&#xff1a;http://kdtx-test.itheima.net/api/captchaIm…

基于Python实现的通用小规模搜索引擎

基于Python实现的通用小规模搜索引擎 1.项目简介 1.1背景 《信息内容安全》网络信息内容获取技术课程项目设计 一个至少能支持10个以上网站的爬虫程序&#xff0c;且支持增量式数据采集;并至少采集10000个实际网页;针对采集回来的网页内容&#xff0c; 能够实现网页文本的分…

查找路由器的管理后台ip【通用找IP】

需求&#xff1a; 刚刚搞了个【小米】路由器&#xff0c;我想进路由的管理后台&#xff0c;提示&#xff1a;安装xx的路由管家&#xff0c;我不想安装 但是无法找到这个管理后台。 而且我是用这个路由作为中继&#xff0c;那么这个路由的ip就会经常更换 尝试通过网上搜索引擎来…

混合专家模型 (MoE)笔记摘要

ref&#xff1a; https://huggingface.co/blog/zh/moe#%E4%BB%80%E4%B9%88%E6%98%AF%E6%B7%B7%E5%90%88%E4%B8%93%E5%AE%B6%E6%A8%A1%E5%9E%8B 简短总结 混合专家模型 (MoEs): 与稠密模型相比&#xff0c; 预训练速度更快 与具有相同参数数量的模型相比&#xff0c;具有更快的…

01 Oracle自学环境搭建

1 Oracle12C安装 1.1 下载 官网地址&#xff1a;https://www.oracle.com/ 解压安装包 运行安装程序 1.2 安装 配置安全更新 软件更新 安装选项 系统类 Oracle主目录用户选择 使用现有windows用户&#xff1a;如果选择该项&#xff0c;则需要指定没有管理权限的用户。 创建新Wi…

【Python】Python与C的区别

文章目录 语句结束符代码块表示变量声明函数定义注释格式Python的标识符数据输入input()函数数据输出print()函数 语句结束符 C 语言 C 语言中每条语句必须以分号;结束。例如&#xff0c;int a 10;、printf("Hello, World!");。分号是语句的一部分&#xff0c;用于…

安科瑞 Acrel-1000DP 分布式光伏监控系统在工业厂房分布式光伏发电项目中的应用

吕梦怡 18706162527 摘 要&#xff1a;常规能源以煤、石油、天然气为主&#xff0c;不仅资源有限&#xff0c;而且会造成严重的大气污染&#xff0c;开发清洁的可再生能源已经成为当今发展的重要任务&#xff0c;“节能优先&#xff0c;效率为本”的分布式发电能源符合社会发…

逆向 易九批 最新版 爬虫逆向 x-sign ......

声明 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; # 欢迎交流 wjxch1004

TensorFlow Quantum快速编程(高级篇)

五、实战:量子分类器应用 5.1 数据准备 在实战构建量子分类器时,数据准备是基石环节。选用鸢尾花数据集,这一经典数据集在机器学习领域应用广泛,其涵盖了三种鸢尾花品种的样本,每个样本包含花萼长度、花萼宽度、花瓣长度、花瓣宽度四个特征。鉴于本次构建二分类量子分类…

maven高级(day15)

Maven 是一款构建和管理 Java 项目的工具 分模块设计与开发 所谓分模块设计&#xff0c;顾名思义指的就是我们在设计一个 Java 项目的时候&#xff0c;将一个 Java 项目拆分成多 个模块进行开发。 分模块设计我们在进行项目设计阶段&#xff0c;就可以将一个大的项目拆分成若干…

android studio根据包名获取当前安装包信息

package com.example.myapplication2;import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.util.Log;/**** 获取版本信息*/ public class SystemHelper {/*** 获取本地软件版本号*/public stat…

安卓硬件加速hwui

安卓硬件加速 本文基于安卓11。 从 Android 3.0 (API 级别 11) 开始&#xff0c;Android 2D 渲染管道支持硬件加速&#xff0c;这意味着在 View 的画布上执行的所有绘图操作都使用 GPU。由于启用硬件加速所需的资源增加&#xff0c;你的应用程序将消耗更多内存。 软件绘制&am…

口碑很好的国产LDO芯片,有哪些?

在几乎任何一个电路设计中&#xff0c;都可能会使用LDO&#xff08;低压差线性稳压器&#xff09;这个器件。 虽然LDO不是什么高性能的IC&#xff0c;但LDO芯片市场竞争异常激烈。最近几年&#xff0c;诞生了越来越多的精品国产LDO&#xff0c;让人看得眼花缭乱。 业内人士曾经…

实训云上搭建集群

文章目录 1. 登录实训云1.1 实训云网址1.2 登录实训云 2. 创建网络2.1 网络概述2.2 创建步骤 3. 创建路由器3.1 路由器名称3.1 创建路由器3.3 查看网络拓扑 4. 连接子网5. 创建虚拟网卡5.1 创建原因5.2 查看端口5.3 创建虚拟网卡 6. 管理安全组规则6.1 为什么要管理安全组规则6…

win32汇编环境,怎么进行乘法运算的

;运行效果 ;win32汇编环境,怎么进行乘法运算的 ;基础知识&#xff0c;重新复习一下。 ;首先需明白字节的概念。1个字节是8位&#xff0c;al和ah都是8位的&#xff0c;8位之中每位要么是0&#xff0c;要么是1&#xff0c;假如8位都是1&#xff0c;就是16进制的FF&#xff0c;也就…

opencv的NLM去噪算法

NLM&#xff08;Non-Local Means&#xff09;去噪算法是一种基于图像块&#xff08;patch&#xff09;相似性的去噪方法。其基本原理是&#xff1a; 图像块相似性&#xff1a;算法首先定义了一个搜索窗口&#xff08;search window&#xff09;&#xff0c;然后在该窗口内寻找…

poi处理多选框进行勾选操作下载word以及多word文件压缩

一、场景 将数据导出word后且实现动态勾选复选框操作 eg: word模板 导出后效果&#xff08;根据数据动态勾选复选框&#xff09; 二、解决方案及涉及技术 ① 使用poi提供的库进行处理&#xff08;poi官方文档&#xff09; ② 涉及依赖 <!-- excel工具 --><depen…

【update 更新数据语法合集】.NET开源ORM框架 SqlSugar 系列

系列文章目录 &#x1f380;&#x1f380;&#x1f380; .NET开源 ORM 框架 SqlSugar 系列 &#x1f380;&#x1f380;&#x1f380; 文章目录 系列文章目录前言 &#x1f343;一、实体对象更新1.1 单条与批量1.2 不更新某列1.3 只更新某列1.4 NULL列不更新1.5 无主键/指定列…