@Scheduled注解 定时任务讲解

news2024/9/23 13:29:14

用于在Java Spring框架中定时执行特定任务的注解 @Scheduled,它能够指定方法在特定时间间隔或特定时间点执行。默认参数是cron,cron参数被用来定义一个Cron表达式,它代表了任务执行的时间规则在这里插入图片描述
参数如下
在这里插入图片描述

Cron

这是是一种时间表达式,用于表示定时任务的执行规则。在Spring中,@Scheduled注解的cron参数就是用来设置Cron表达式的。Cron表达式的基本格式为:

secdond minute hour dayOfMonth month dayOfWeek year

每个字段的含义如下:

  1. second:秒(0-59)
  2. minute:分钟(0-59)
  3. hour:小时(0-23)
  4. dayOfMonth:月份中的某一天(1-31)
  5. month:月份(1-12或者 JAN-DEC)
  6. dayOfWeek:星期中的某一天(1-7或者 SUN-SAT)
  7. year:年份(留空表示任何年份)

使用*表示匹配任意值,例如,在month字段中表示每个月,而在dayOfWeek字段中表示每一天。除了之外,你还可以使用一些其他符号,比如:

8.-:表示一个范围,比如 1-5 表示1到5。
9.,:表示一个列表,比如 1,3,5 表示1、3和5。
10./:表示间隔,比如 0/15 表示每隔15分钟。

例如,要设置每天上午10点执行任务,Cron表达式可以是 0 0 10 * * ?。 0 0/1 * * * ?,表示每隔一分钟执行一次任务。

示例:

@Scheduled(cron = “0 15 10 * * ?”) // 每天上午10:15执行

fixedRate

这个参数定义了方法调用之间的固定周期,单位为毫秒。不论前一次方法执行花费了多长时间,都会按照这个间隔执行。如果上一个任务堵塞不排除脏数据的风险
示例:

   @Scheduled(fixedRate = 1000) // 每1000毫秒执行一次

fixedDelay

这个参数定义了在上一次方法执行完毕后到下一次开始执行的间隔时间,单位也是毫秒。不同于 fixedRate,fixedDelay 会等待前一次方法执行完成后才开始计时。
示例:

@Scheduled(fixedDelay = 1000) // 完成后1000毫秒再次执行

initialDelay

:这个参数用来定义延迟首次执行任务的时间,单位为毫秒。它通常与 fixedRate 或 fixedDelay 结合使用,用来设置启动后延迟执行任务。
示例:

@Scheduled(fixedRate = 1000, initialDelay = 1000) // 启动后延迟1000毫秒,之后每1000毫秒执行一次

zone

:用于指定 cron 表达式的时区,默认是服务器的本地时区。
示例:

   @Scheduled(cron = "0 15 10 * * ?", zone = "America/New_York") // 指定时区为纽约

使用 @Scheduled 注解需要在 Spring 配置中启用定时任务(通过注解 @EnableScheduling)。这样,Spring 的任务调度器就会自动识别使用了 @Scheduled 注解的方法,并根据设定的规则执行这些方法。

最后在启动类上开启该方法@EnableScheduling

多个服务导致资源冲突问题

当多个服务同时操作一个任务就会造成数据冲突,所以就需要分布式锁,redis的setnx,无状态,可共享,读取块就能成为很好的解决方案在这里插入图片描述
redisssesion实现分布式锁
也可以只有使用redis 上锁方法

  public String tryLock(String name, long expire) {
        name = name + "_lock";
        String token = UUID.randomUUID().toString();
        RedisConnectionFactory factory = stringRedisTemplate.getConnectionFactory();
        RedisConnection conn = factory.getConnection();
        try {

            //参考redis命令:在redis中存入数据 数据明 uuid token 为锁的名字
//            因为这个数据的名字都是name+_locak 所以每次调用加锁方法setnx 只有一个成功调用的才能才能成功的保存的一个锁数据,其他的只能无法设置
            //set key value [EX seconds] [PX milliseconds] [NX|XX]
            Boolean result = conn.set(
                    name.getBytes(),
                    token.getBytes(),
                    Expiration.from(expire, TimeUnit.MILLISECONDS),
                    RedisStringCommands.SetOption.SET_IF_ABSENT //NX
            );
            if (result != null && result)
                return token;
        } finally {
            RedisConnectionUtils.releaseConnection(conn, factory,false);
        }
        return null;
    }

方法调用
因为我的定时任务是每隔1minute 执行一次,所以每次上锁30s,让其他任务线程无法获取,这里是统一名字实际业务开发,一个数据的操作可以使用一个数据的主键+前后缀来作为锁名


 @Scheduled(cron = "0 */1 * * * ?")
    public void refresh(){

        String token = cacheService.tryLock("FUTURE_TASK_SYNC", 1000 * 30);
        if(StringUtils.isNotBlank(token)){
       //。。。。。执行逻辑
            }
        }
    }

如果这个定时任务是你的服务一启动就开始计时的,那么可以在该方法 添加这初始化注解 @PostConstruct,在启动类一启动伴随ioc初始化

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

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

相关文章

Python版本切换的解决方法,升级Python 2.7 到 Python 3.7

之前解决问题的时候,记录的一个Python版本切换的解决方法,今天在解决其他问题的时候,查看了下之前写的这个解决方法。还是很适用的。然后加入了下linux系统中python配置修改的问题。 Mac 升级Python 2.7 到 Python 3.7 1、python3.7官网下载…

【SpringBoot】 This application has no explicit mapping for 解决方法

This application has no explicit mapping for 解决方法 This application has no explicit mapping for 解决方法一、背景二、原因三、解决方案方式一:方式二: 四、解决 This application has no explicit mapping for 解决方法 一、背景 在SpringBo…

EXCEL小技巧

1、两列文本合并显示: CONCATENATE(B6,E6) (如果显示公式而非文本,就是公式输错了,比如后缺少空格)

Word中如何实现 图片 | 表格 自动编号与文中引用编号对应

当我们在进行大篇幅word文档的编写时,为了节约修改文章中图片或表格所花费的大量时间,可以将图片自动编号,且让文中引用的顺序跟着图片顺序的变化而变化,具体操作如下: 1. 将鼠标定位在图片或者表格欲加编号的下方或上…

ChatGPT有效开通方法*建议收藏*

ChatGPT Plus和API开通方法*建议收藏* 前期准备: 一个ChatGPT账户 一张虚拟卡 开通ChatGPT Plus会员,很多朋友担心虚拟卡订阅会封号,只要不勤换登陆IP不会使出现问题。而且目前大部分用户都是使用虚拟卡开通的会员 第一步:登…

基于STC12C5A60S2系列1T 8051单片读写掉电保存数据IIC总线器件24C02地址码并显示在液晶显示器LCD1602上应用

基于STC12C5A60S2系列1T 8051单片读写掉电保存数据IIC总线器件24C02地址码并显示在液晶显示器LCD1602上应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍液晶显示器…

大数据-计算框架选型与对比

计算框架选型与对比 一、大数据平台二、计算框架分类1.批处理架构2.实时流处理架构3.流批一体处理架构 三、计算框架关键指标1.处理模式2.可伸缩性3.消息传递3.1 至少一次(at least once)3.2 至多一次(ai most once)3.3 恰好一次&…

交叉编译安装时报错 ./install.sh: 15: ./install.sh: Bad substitution

报错信息截图如下: 解决方法 vim install.sh #!/bin/sh -e 修改为 !/bin/bash -e重新执行 sudo ./install.sh 成功运行

Leetcode算法系列| 1. 两数之和(四种解法)

目录 1.题目2.题解解法一:暴力枚举解法二:哈希表解法解法三:双指针(有序状态)解法四:二分查找(有序状态) 1.题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数…

Endnote软件添加期刊引用格式

在下述网址中,找到你想要添加的期刊,下载引用格式文件(后缀为.ens格式) https://endnote.com/downloads/styles/?wpv_post_searchInformationfusion&wpv_aux_current_post_id12829&wpv_view_count12764-TCPID12829 下载…

C语言——从键盘输人一个表示年份的整数,判断该年份是否为闰年,并显示判断结果。

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int year 0;printf("请输入年份&#xff1a;");scanf("%d",&year);if((year%4 0) && (year%100!0) || (year%400 0)){printf("%d是闰年\n",year);}else{p…

人工标签不准确的一种解决方案:PCA降维可视化筛选正样本

背景 在实际的业务场景里&#xff0c;用会话文本构建模型&#xff08;机器学习/深度学习&#xff09;来做意图分类之类的任务时&#xff0c;经常会出现人工打标不够准确的问题&#xff0c;标签都不准确的话模型当然无法学习到有效信息了。这个问题真的非常头疼…除了与业务沟通…

【CCF-PTA】第03届Scratch第03题 -- 参观食品厂

参观食品厂 【题目描述】 光明小学定期组织学生参与社会实践&#xff0c;最近的活动主题是参观自动化食品厂。小明看到生产线可以自动筛选罐头重量是否合格&#xff0c;感到十分好奇。回来后&#xff0c;小明准备写一个模拟程序&#xff0c;输入10盒罐头的重量&#xff0c;程…

openGauss学习笔记-131 openGauss 数据库运维-启停openGauss

文章目录 openGauss学习笔记-131 openGauss 数据库运维-启停openGauss131.1 启动openGauss131.2 停止openGauss131.3 示例131.3.1 启动openGauss131.3.2 停止openGauss 131.4 错误排查 openGauss学习笔记-131 openGauss 数据库运维-启停openGauss 131.1 启动openGauss 以操作系…

前端 vue 面试题(二)

文章目录 如何让vue页面重新渲染组件间通信vue为什么要mutation、 action操作插槽、具名插槽、作用域插槽vue编译使用的是什么库&#xff1f;vue怎么实现treeshakingwebpack实现treeshaking为什么只有es module 能支持 tree shaking mixin 的作用mixin的底层原理nexTick原理vue…

python -opencv 图像锐化

python -opencv 图像锐化 图像锐化其实&#xff0c;是一种增强图片对比度的技术&#xff0c;我们可以通过计算图像的导数&#xff0c;把导数绝对值数值大于零的数值加回原图像&#xff0c;通过这种方法&#xff0c;可以增强图像的对比度。 实现代码如下&#xff1a; import c…

Django之中间件与CSRF_TOKEN

文章目录 一、什么是中间件二、中间件有什么用三、Django自定义中间件中间件中主要方法及作用创建自定义中间件的步骤&#xff1a;process_request与process_response方法process_view方法process_exceptionprocess_template_response&#xff08;不常用&#xff09; 四、CSRF_…

Django DRF序列化器serializer

以下案例由浅到深&#xff0c;逐步深入&#xff0c;通过实例介绍了序列化器的使用方法&#xff0c;和遇到的常见问题的解决方法。 一、序列化器serializers.Serializer 1、urls.py urlpatterns [path("api/<str:version>/depart/",views.DepartView.as_vie…

找论文找论文

这里写目录标题 找到的&#xff0c;待筛选识别检测 OCR综述&#xff0c;经典论文综述OCR识别OCR检测端到端文本识别问题集怎么看一篇论文有没有代码怎么直接找比如某一年的CVPR关于OCR方面的最新论文拿到一篇论文&#xff0c;根据论文名字怎么检索到期刊和发表日期 功能技巧找顶…

geoserver发布tif矢量数据图层

cesium加载上传至geoserver的tif矢量数据_cesium加载tiff-CSDN博客 geoserver安装及跨域问题解决方案&#xff1a;geoserver安装及跨域问题解决方案_geoserver 跨域_1 1王的博客-CSDN博客 将TIF上传至geoserver 启动geoserver服务&#xff0c;并进入geoserver主页。 1. 新建…