ShedLock的使用

news/2024/10/26 15:30:10/

通常,我们在公司里的部分对外服务都是多集群多节点部署的。同时我们可能一些拆分的不是很细的服务,里面混杂着一些定时任务。

而定时任务中,有些业务为了防止同一时间并发操作,我们就用到了“分布式锁”。
一般最简单的方法我们就是使用redis加锁机制来实现分布式锁
这里我我们使用ShedLock来在定时任务中实现分布式锁

maven

        <dependency><groupId>net.javacrumbs.shedlock</groupId><artifactId>shedlock-spring</artifactId><version>4.3.0</version></dependency><dependency><groupId>net.javacrumbs.shedlock</groupId><artifactId>shedlock-provider-redis-jedis</artifactId><version>4.3.0</version></dependency>

配置LockProvider

单节点测试
    @Beanpublic JedisPool createJedisCluster() {// 因为我是本地测试的代码,所以使用的是jedisPoolJedisCluster jedisCluster = new JedisCluster(hostAndPorts);JedisPool jedisPool = new JedisPool();return jedisPool;}@Beanpublic LockProvider createLockProvider(JedisPool jedisPool) {JedisLockProvider jedisLockProvider = new JedisLockProvider(jedisPool);return jedisLockProvider;}
集群测试
    @Beanpublic JedisCluster createJedisCluster() {HashSet<HostAndPort> hostAndPorts = new HashSet<>();hostAndPorts.add(new HostAndPort("ip", port));JedisCluster jedisCluster = new JedisCluster(hostAndPorts);return jedisCluster;}@Beanpublic LockProvider createLockProvider(JedisCluster jedisCluster) {JedisLockProvider jedisLockProvider = new JedisLockProvider(jedisCluster);return jedisLockProvider;}

开启SchedLock

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

创建定时任务

@Component
class BaeldungTaskScheduler {@Scheduled(cron = "0 0/15 * * * ?")@SchedulerLock(name = "TaskScheduler_scheduledTask", lockAtLeastForString = "PT5M", lockAtMostForString = "PT14M")public void scheduledTask() {// ...}
}

参数说明

@SchedulerLock注解主要参数:
name:锁的名称,必须保证唯一;
lockAtMostFor:成功执行任务的节点所能拥有的独占锁的最长时间,设置的值要保证比定时任务正常执行完成的时间大一些;
lockAtLeastFor:成功执行任务的节点所能拥有的独占锁的最短时间,其主要目的是任务执行时间可能很短,防止多个节点执行。
@EnableSchedulerLock注解主要参数:
defaultLockAtMostForlockAtMostFor的默认时间;
defaultLockAtLeastForlockAtLeastFor的默认时间。

ISO8601时间格式

格式解析
R2/2023-06-04T20:15:14.765432+08:00/P1DT10S

上面的字符串通过"/"分为了三部分即:

重复次数/开始时间/运行间隔

重复次数

R - 将永远重复
R1 - 将重复一次
R23 - 将重复23次。

开始时间

其中"T"用来分割日期和时间,时间后面跟着的"+08:00"表示东八区,注意"+"是连字符,不是加号。
时区默认是0时区,可以用"Z"表示,也可以不写。
上面的字符串表示 2023年6月4日,20点15分14秒765432纳秒,东八区。

运行间隔

运行间隔以"P"开始,和上面一样也是用"T"分割日期和时间,如P2Y2M10DT2H30M15S

  • P     开始标记

  • 2Y    两年

  • 2M   两个月

  • 10D  十天

  • T       时间和日期分的割标记

  • 2H     两个小时

  • 30M   三十分钟

  • 15S   十五秒钟

例子,注意如果没有年月日,"T"也不能省略

P1DT1M     一天一分钟执行一次
P1W            一周执行一次
PT1H           一小时执行一次
PT10S          十秒执行一次


http://www.ppmy.cn/news/349100.html

相关文章

mac docker 安装 ES

一. docker 安装 ES 1. 下载镜像 docker pull elastcisearch:8.7.1 2. 启动镜像 docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" -e ES_JAVA_OPTS"-Xms256m -Xmx256m" elasticsearch:8.7.1 参数说明…

python使用pymysql来操作MySQL

例子1 from pymysql import Connection# 构建到MySQL数据库的连接 conn Connection(host"localhost",port3306,user"root",password"123456",autocommitTrue # 设置自动提交 )print(conn.get_server_info())# 要执行SQL查询必须要先获得游标对象…

宏晶微MS2109高清视频采集芯片资料

MS2109是一款高清视频传采集晶片&#xff0c;内部集成USB2.0控制器和数据收发模块&#xff0c;HDMI RX模块和音视频处理模块。MS2109可以将HDMI接口输出的音视频信号通过USB接口传送到PC&#xff0c;智慧型手机或者平板电脑预览或者采集。USB视频符合UVC规范&#xff0c;音频符…

GSCOOLINK GSV2006替CH6002 HDMI2.0接口芯片

GSV2006是100%纯国产产品 GSV2006是 HDMI2.0/HDCP2.2 2x4 矩阵, 支持DownScaler, CSC 及音频分离和音频嵌入&#xff0c;支持ARC 及CEC 功能。 目标应用&#xff1a;HDMI2.0矩阵&#xff0c;分离器。 功能特征 1、2进4出 2、18 Gbps 3、灵活的HDCP 2.2/1.4支持 4、双路音频…

《嵌入式 – GD32开发实战指南》第21章 I2C

开发环境&#xff1a; MDK&#xff1a;Keil 5.30 开发板&#xff1a;GD32F207I-EVAL MCU&#xff1a;GD32F207IK 21.1 I2C工作原理 21.1.1 I2C串行总线概述 I2C总线是PHLIPS公司推出的一种双线式半双工串行总线&#xff0c;是具备多主机系统所需的总线裁决和高低速器件同步功…

展讯UIS8910FF

目录 1. 产品简介 1.1. 文档约定 2.功能特性 2.1. 特性列表 2.2. 系统框架 3.物理接口 3.1. 管脚分布 1. 产品简介 展讯UIS8910FF系列模组是基于紫光展锐 LTE平台方案开发的LTE CAT1/GSM系列无线通信产品&#xff0c;能够通过FDD-LTE、TDD-LTE 和GSM 实现数据连接&#…

GSCOOLINK基石 GSV2002替IT66321 HDMI2.0

GSV2002是100%纯国产产品 GSCOOLINK GSV2002 HDMI2.0芯片替代IT66321 GSV2002是HDMI2.0/HDCP2.2 2x2 矩阵,支持DownScaler, CSC 及音频分离和音频嵌入&#xff0c;支持ARC 及CEC 功能。 GSV2002目标应用&#xff1a;矩阵&#xff0c;分配器切换器,条形音响&#xff0c;AVR 等…

TIC2000系列处理器在线升级

_c_int00是CPU退出boot ROM 引导代码结束后&#xff0c;通过code_start段的跳转函数引用的库中的一个函数&#xff0c;这个函数是main函数的引用者&#xff0c;也是定义者。其位于rts2800_fpu32.lib中&#xff0c;要实现SBL,APP,kernel之间的顺利跳转&#xff0c;需要修改_c_in…