@Scheduled注解 定时任务讲解

用于在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)){//。。。。。执行逻辑}}}

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

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

相关文章

模拟量采集----测量输入的电流

生活中的模拟量有很多 大多都为电压信号和电流信号 今天讲如何测量输入的电流信号 通过欧姆定律可知 电流测量的测量:是将电流加载在固定阻值的电阻上,来测量这个电阻二端的电压 最后反算出电流的大小 所用的公式是IU/R 我们使用仿真软件来看测量…

CST同轴馈电步骤

CST同轴馈电步骤 算例1. 同轴内芯2. 填充材料3. 外皮4. GND减去一个圆形,使EMWAVE可以通过5. 添加端口6. 结果比较 算例 cst模型库中的一个圆贴片 1. 同轴内芯 2. 填充材料 他这里直接使用和介质基板一样的材料并且进行了合并,我就懒得再改了&#x…

使用Pytorch从零开始构建WGAN

引言 在考虑生成对抗网络的文献时,Wasserstein GAN 因其与传统 GAN 相比的训练稳定性而成为关键概念之一。在本文中,我将介绍基于梯度惩罚的 WGAN 的概念。文章的结构安排如下: WGAN 背后的直觉;GAN 和 WGAN 的比较;…

一点DETR学习

DETR: 主要是为了学习query。 主要从两个方面:加偏好和缩短序列长度

Docker Swarm总结(1/3)

目录 1、swarm 理论基础 1.1 简介 1.2 节点架构 1.3 服务架构 1.4 服务部署模式 2、swarm 集群搭建 2.1 需求 ​2.2 克隆主机 2.3 启动5个docker宿主机 2.4 查看 swarm 激活状态 2.5 关闭防火墙 2.6 swarm 初始化 2.7 添加 worker 节点 2.8 添加 manager 节点 3、…

鸿蒙4.0开发笔记之ArkTs语言基础与基本组件结构(四)

文章声明&#xff1a;本文关于HarmonyOS系统的部分内容和描述借鉴于华为官网的“HarmonyOS开发者学堂”&#xff0c;有需要的也可以进入官网查看。<HarmonyOS第一课>ArkTS开发语言介绍 一、ArkTs语言介绍 ArkTS是鸿蒙系统&#xff08;HarmonyOS&#xff09;优选的主力应…

老生常谈之 JavaScript 中 0.1 + 0.2 != 0.3 的原因

先来一个模棱两可的说法&#xff1a;因为精度丢失、存储溢出的问题 先复习一下二进制的转换方法&#xff1a; 整数&#xff1a;除以基数&#xff0c;取余&#xff0c;自底向上小数&#xff1a;乘以基数&#xff0c;取整&#xff0c;自顶向下 接着&#xff0c;复习一下双精度…

二叉搜索树java实现

顾名思义&#xff0c;二叉搜索树是一棵二叉树&#xff0c;每个节点就是一个对象&#xff0c;这个对象包含属性left、right和parent。left指向节点的左孩子&#xff0c;right指向节点的右孩子&#xff0c;parent指向节点的父节点&#xff08;双亲&#xff09;。如果某个孩子节点…

MySql表中添加emoji表情

共五处需要修改。 语句执行修改&#xff1a; ALTER TABLE xxxxx CONVERT TO CHARACTER SET utf8mb4;

【论文阅读】An Experimental Survey of Missing Data Imputation Algorithms

论文地址&#xff1a;An Experimental Survey of Missing Data Imputation Algorithms | IEEE Journals & Magazine | IEEE Xplore 处理缺失数据最简单的方法就是是丢弃缺失值的样本&#xff0c;但这会使得数据更加不完整并且导致偏差或影响结果的代表性。因此&#xff0c;…

13.求面积[有问题]

#include<stdio.h> #include<math.h> #include<bits/stdc.h> using namespace std;void fun(double a,b,c) {double p,c;p (abc)/2;c sqrt(p*(p-a)*(p-b)*(p-c));printf("面积是&#xff1a;%lf",c); }int main(){double a,b,c;scanf("%lf,%…

链表OJ--下

文章目录 前言一、链表分割二、环形链表I三、环形链表II四、链表的回文结构五、随机链表的复制 前言 一、链表分割 牛客网CM11&#xff1a;链表分割- - -点击此处传送 题解&#xff1a; 思路图&#xff1a; 代码&#xff1a; 二、环形链表I 力扣141&#xff1a;环形链表…