spring task使用

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

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

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

相关文章

【Linux】文件 文件描述符fd

&#x1f33b;个人主页&#xff1a;路飞雪吖~ &#x1f320;专栏&#xff1a;Linux 目录 &#x1f33b;个人主页&#xff1a;路飞雪吖~ 一、C文件接口 &#x1f31f;写文件 &#x1f320;小贴士&#xff1a; &#x1f320;stdin && stdout && stderr Linux下…

uni-app如何引入echarts

在uni-app官网的官网插件中找echarts 打开图片对应的echarts&#xff0c;点击下载并导入插件 如果是vue3使用const echarts require(../../uni_modules/lime-echart/static/echarts.min);引入echarts <template><view><view style"width:750rpx; height:…

ue5 GAS 从零开始00

技能属性GAS 技能 属性 创建一个项目c 插件搜索 gameplay 保证这里勾选上 把这三个弄上去 “GameplayAbilities”,“GameplayTags”,“GameplayTasks” 这样就加载了三个模块 一定要先关ue 先关掉ue 生成 如果没编过&#xff0c;你就检查模块名字是不是没写对 一定要…

基于SpirngBoot的家电销售管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

Redis之秒杀活动

目录 全局唯一ID&#xff1a; 为什么 count 不可能为 null&#xff1f; 为什么返回值是 timestamp << COUNT_BITS | count&#xff1f; 整体的逻辑 (1) 生成时间戳 (2) 生成序列号 (3) 拼接时间戳和序列号 超卖问题&#xff1a; 基于版本号的乐观锁 CAS思想 …

Linux环境(Ubuntu)上搭建MQTT服务器(EMQX )网络环境部署

支持的 Ubuntu 版本&#xff1a;Ubuntu 22.04(本人使用)、Ubuntu 20.04、Ubuntu 1 下面开始环境搭建&#xff1a; &#xff08;1&#xff09;从github在线地址克隆压缩包&#xff0c;然后进行压缩&#xff08;不好用&#xff09;&#xff0c;在对环境进行依赖包的下载 &…

JavaSE(十五)——认识进程与多线程入门

文章目录 认识进程进程的概念进程的特性进程的状态进程的优先级进程的描述进程的调度 并发与并行认识线程线程的概念Java中线程的表示认识Thread类线程的创建 线程的控制和管理线程启动-start()线程休眠-sleep()线程中断-interrupt()线程插队-join()线程让步-yield() 线程的状态…

EasyCVR视频汇聚平台如何配置webrtc播放地址?

EasyCVR安防监控视频系统采用先进的网络传输技术&#xff0c;支持高清视频的接入和传输&#xff0c;能够满足大规模、高并发的远程监控需求。平台支持多协议接入&#xff0c;能将接入到视频流转码为多格式进行分发&#xff0c;包括RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、W…

【免费开源】积木JimuBI大屏集成ruoyiVue

JimuBI介绍 JimuBI 是一个JAVA语言的低代码数据可视化大屏BI产品&#xff0c;将大屏、仪表盘、移动面板、图表或页面元素封装为基础组件&#xff0c;无需编写代码即可完成业务需求。 这是JeecgBoot团队出品的另外一款报表产品&#xff0c;积木报表已经成为业内报表首先&#x…

mysql binlog 日志分析查找

文章目录 前言一、分析 binlog 内容二、编写脚本结果总结 前言 高效快捷分析 mysql binlog 日志文件。 mysql binlog 文件很大 怎么快速通过关键字查找内容 一、分析 binlog 内容 通过 mysqlbinlog 命令可以看到 binlog 解析之后的大概样子 二、编写脚本 编写脚本 search_…

如何在谷歌浏览器中使用安全沙箱

谷歌浏览器的沙箱机制是一种重要的安全功能&#xff0c;可以有效隔离浏览会话中的每个标签页和插件&#xff0c;以防止恶意软件攻击用户系统。本文将详细介绍如何在谷歌浏览器中启用和使用沙箱功能。 一、什么是谷歌浏览器沙箱&#xff1f; 谷歌浏览器的沙箱是一种安全机制&am…

【C++】C++11(二)

目录 九、可变参数模板十、lambda表达式10.1 C98中的一个例子10.2 lambda表达式10.3 lambda表达式语法10.3.1 lambda表达式各部分说明10.3.2 捕获列表说明 10.4 函数对象与lambda表达式 十一、包装器11.1 function包装器11.2 bind 十二、线程库12.1 线程12.1.1 thread类的简单介…

《零基础Go语言算法实战》【题目 1-16】字符串的遍历与比较

《零基础Go语言算法实战》 【题目 1-16】字符串的遍历与比较 给出两个字符串&#xff0c;请编写程序以确定能否将其中一个字符串重新排列后变成另一个字符串&#xff0c; 并规定大小写是不同的字符&#xff0c;空格也作为字符考虑。保证两个字符串的长度小于或等于 5000。 …

Type-C单口便携显示器-LDR6021

Type-C单口便携显示器是一种新兴的显示设备&#xff0c;它凭借其便携性、高性能和广泛的应用场景等优势&#xff0c;正在成为市场的新宠。以下是Type-C单口便携显示器的具体运用方式&#xff1a; 一、连接与传输 1. **设备连接**&#xff1a;Type-C单口便携显示器通过Type-C接…

聚类系列 (二)——HDBSCAN算法详解

在进行组会汇报的时候&#xff0c;为了引出本研究动机&#xff08;论文尚未发表&#xff0c;暂不介绍&#xff09;&#xff0c;需要对DBSCAN、OPTICS、和HDBSCAN算法等进行详细介绍。在查询相关资料的时候&#xff0c;发现网络上对于DBSCAN算法的介绍非常多与细致&#xff0c;但…

玩转 JMeter:Random Order Controller让测试“乱”出花样

嘿&#xff0c;各位性能测试的小伙伴们&#xff01;今天咱要来唠唠 JMeter 里超级有趣又超实用的 Random Order Controller&#xff08;随机顺序控制器&#xff09;&#xff0c;它就像是性能测试这场大戏里的“魔术棒”&#xff0c;轻轻一挥&#xff0c;就能让测试场景变得千变…

L1G5000 XTuner 微调个人小助手认知

使用 XTuner 微调 InternLM2-Chat-7B 实现自己的小助手认知 1 环境配置与数据准备步骤 0. 使用 conda 先构建一个 Python-3.10 的虚拟环境步骤 1. 安装 XTuner 修改提供的数据步骤 0. 创建一个新的文件夹用于存储微调数据步骤 1. 创建修改脚本步骤 2. 执行脚本步骤 3. 查看数据…

UE5 使用内置组件进行网格切割

UE引擎非常强大&#xff0c;直接内置了网格切割功能并封装为蓝图节点&#xff0c;这项功能在UE4中就存在&#xff0c;并且无需使用Chaos等模块。那么就来学习下如何使用内置组件实现网格切割。 1.配置测试用StaticMesh 对于被切割的模型&#xff0c;需要配置一些参数。以UE5…

springmvc执行分析

步骤分析 1.浏览器客户端携带请求路径&#xff0c;本案例中是“/hello”&#xff0c;通过 web.xml 中的前端控制器配置&#xff0c;发送请求到前端控制器(DispatcherServlet)&#xff0c;并加载 SpringMVC.xml 配置文件&#xff0c;将 HelloController 加载进IOC容器当中&…

LLM - Llama 3 的 Pre/Post Training 阶段 Loss 以及 logits 和 logps 概念

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/145056912 Llama 3 是 Meta 公司发布的开源大型语言模型&#xff0c;包括具有 80 亿和 700 亿参数的预训练和指令微调的语言模型&#xff0c;支持…