@SchedulerLock注解使用

文章目录

  • @Scheduled注解
  • 参数介绍
  • 建表
  • 配置类
  • 示例
  • 参考

如果服务中使用了@Scheduled注解,且服务部署了多个节点。那么在同一时刻,所有节点都会执行定时任务。但有有些任务我们只需执行一次,这就需要使用分布式锁的方式来控制,如可以使用如基于Redis的Lock4J框架。

@Scheduled注解

本文介绍一个SchedulerLock,SchedulerLock分布式锁可以基于Mysq,Redis、Mongo等中间件,本文介绍基于Mysql的方式,为什么使用Mysql呢,因为Mysql是我们业务中基本上一定会使用的中间件,使用MySQL不使用Redis,可以减少一个中间件,哈哈。
在bulid文件引入依赖,建议引入较新版本

    api 'net.javacrumbs.shedlock:shedlock-spring:4.42.0'api 'net.javacrumbs.shedlock:shedlock-provider-jdbc-template:4.42.0'

较新版本中的@SchedulerLock源码只有3个参数,比老版本的较少。

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface SchedulerLock {/*** Lock name.*/String name() default "";/*** How long the lock should be kept in case the machine which obtained the lock died before releasing it.* This is just a fallback, under normal circumstances the lock is released as soon the tasks finishes.** Can be either time with suffix like 10s or ISO8601 duration as described in {@link java.time.Duration#parse(CharSequence)}, for example PT30S.*/String lockAtMostFor() default "";/*** The lock will be held at least for given duration. Can be used if you really need to execute the task* at most once in given period of time. If the duration of the task is shorter than clock difference between nodes, the task can* be theoretically executed more than once (one node after another). By setting this parameter, you can make sure that the* lock will be kept at least for given period of time.** Can be either time with suffix like 10s or ISO8601 duration as described in {@link java.time.Duration#parse(CharSequence)}, for example PT30S.*/String lockAtLeastFor() default "";
}

参数介绍

name任务唯一标识。最重要的参数。同一个name的任务,同一个时刻,多个线程只会有一个线程获取到锁。其他没有获取到锁的线程会跳过,不会阻塞等待
在这里插入图片描述

lockAtLeastFor持有锁的最短时间。这个主要是防止不同节点时间存在误差,比如有个任务是0点执行,节点1的时间是准的,在0点执行花了30秒执行完成。节点2的时间比节点1慢了1分钟,那么节点2到0点的时候,又执行了一次任务。这个参数可以设置10秒、30秒等。保证不同节点的时间戳不会出现。
lockAtMostFor持有锁的最长时间。主要是为了防止死锁。当一个任务执行完成时会释放锁,当一个任务执行超过lockAtMostFor时间时,也会释放锁。这个时间要大于业务执行的时间,不然一个任务可能会被执行多次。

建表

我这里是使用的MySQL方式,所以需要建表。

CREATE TABLE `shedlock`
(`name`       varchar(64) COLLATE utf8_bin  NOT NULL,`lock_until` timestamp(3)                  NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP (3),`locked_at`  timestamp(3)                  NOT NULL DEFAULT CURRENT_TIMESTAMP(3),`locked_by`  varchar(255) COLLATE utf8_bin NOT NULL,PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

主键一定要是name!

配置类

注入MySQL数据源

@Configuration
@EnableSchedulerLock(defaultLockAtMostFor = "PT180S")
public class ShedlockConfig {@Autowiredprivate DataSource dataSource;@Beanpublic LockProvider lockProvider() {return new JdbcTemplateLockProvider(JdbcTemplateLockProvider.Configuration.builder().withJdbcTemplate(new JdbcTemplate(dataSource)).build());}
}

@EnableSchedulerLock注解不要忘记开启~

示例

    @Scheduled(cron = "0 0/1 * * * ?")@SchedulerLock(name = "myTask1", lockAtLeastFor = "PT30S", lockAtMostFor = "PT20M")public void myTask1() {log.info("mytask start. thread:{} time:{}", Thread.currentThread().getName(), new SimpleDateFormat("yyyy-MM-dd HH::mm:ss").format(new Date()));long start = System.currentTimeMillis();try {myService.process();} catch (Exception e) {log.error("mytask error.", e);}log.info("pmytask. use time:{} s", (System.currentTimeMillis() - start) / 1000);}

执行完后MySQL表会自动生成几天记录,name就是任务名称~
在这里插入图片描述

参考

官方资料:https://github.com/lukas-krecan/ShedLock

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

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

相关文章

七夕情人节有什么好物推荐?五款性价比超高的产品推荐!

亲爱的朋友们,随着七夕情人节的临近,空气中弥漫着浪漫与甜蜜的气息。在这个专属恋人的节日里,团团知道大家在为心爱的人挑选礼物时可能会感到纠结。因此,我根据个人的浪漫经验和精心的市场挑选,为大家准备了一份情人节…

基础实验回顾

一、虚拟机网络设定 克隆一台node1 在node1上进行网络配置 进入网卡配置目录 # 红帽9网卡配置文件目录,其他版本不一样 [rootlocalhost ~]# cd /etc/NetworkManager/system-connections/网卡配置文件 [rootlocalhost system-connections]# vim ens160.nmconnect…

WordPress 轻量级产品官网类主题 CeoNova-Pro_v4.4绕授权开心版

CeoNova-Pro 主题是一款轻量级、且简洁大气、产品官网类主题,定位于高端产品官网、同时包含了知识付费、定制服务、问答社区、论坛交流、网址导航、以及付费产品购买下载等全方位覆盖。 源码下载:ceonova-pro4.4.zip 变更日志 新增虚拟资源隐藏信息增…

GitHub最全中文排行榜开源项目,助你轻松发现优质资源!

文章目录 GitHub-Chinese-Top-Charts:中文开发者的开源项目精选项目介绍项目特点核心功能1. 热门项目榜单2. 详细项目信息 如何使用覆盖范围软件类资料类 GitHub-Chinese-Top-Charts:中文开发者的开源项目精选 在全球范围内,GitHub已经成为了…

vue3直播视频流easy-player

vue3直播视频流easy-player <script src"/easyPlayer/EasyPlayer-element.min.js"></script> easyPlayer文件下载地址 https://download.csdn.net/download/weixin_42120669/89605739 <template><div class"container"><div …

Flask 介绍

Flask 介绍 为什么要学 Flask框架对比设计哲学功能特点适用场景学习曲线总结 Flask 的特点Flask 常用扩展包Flask 的基本组件Flask 的应用场景官方文档官方文档链接文档内容概述学习建议 Flask 是一个使用 Python 编写的轻量级 Web 应用框架。它旨在让 Web 开发变得快速、简单且…

1.4亿中文知识图谱导入Nebula Graph快速体验

1. 史上最大规模的中文知识图谱 Yener 开源了史上最大规模的中文知识图谱—— OwnThink&#xff08;链接&#xff1a;​​https://github.com/ownthink/KnowledgeGraphData​​&#xff0c;数据量为 1.4 亿条。数据以 ​​(实体, 属性, 值)​​ 和 ​​(实体, 关系, 实体)​​…

【最长重复子数组】python刷题记录

R3-滑动窗口专题 . - 力扣&#xff08;LeetCode&#xff09;

Xilinx FPGA 原语解析(一):IBUFDS_GTE3 差分时钟输入缓冲器

目录 1.使用说明 2.实例化代码 3.参数解释 4.端口连接 1.使用说明 IBUFDS_GTE3 是Xilinx FPGA 中用于高速接口的差分时钟信号输入缓冲器。 BUFDS_GTEx&#xff0c;x2/3/4&#xff08;不同系列的FPGA x的值不同&#xff09;&#xff0c;其中UltraScale使IBUFDS_GTE3…

苹果手机录音删除了怎么恢复?快收藏,这3个方法超简单!

在日常生活中&#xff0c;苹果手机的语音备忘录功能为我们捕捉了许多珍贵的瞬间。然而&#xff0c;有时因为误操作或其他原因&#xff0c;我们可能会不小心删除了重要的录音。面对手机录音删除了怎么恢复这种情况&#xff0c;不必慌张&#xff0c;今天小编将向你展示3种简单易行…

ACl访问控制实验

要求&#xff1a;PC1可以telnet登录r1&#xff0c;不能ping通r1&#xff0c;pc1可以ping通r2&#xff0c;但不能telnet登录r2&#xff0c;pc2的所有限制与pc1相反 实验思路&#xff1a;因为华为的ensp默认允许所有&#xff0c;所以只写拒绝规则就行 rule 5 deny icmp source 19…

使用MultipartFile来上传单个及多个文件代码示例(前端传参数及后端接收)

背景 前端使用vue或vue+vant上传文件 后端java接收MultipartFile和其他参数 一、MultipartFile上传单个文件代码示例 1.1 MultipartFile上传单个文件,不包含其它参数 1.1.1 控制层代码如下: /*** 1、上传单个文件,不包含其它参数* */ @PostMapping( "/upload")…

vulhub:nginx解析漏洞CVE-2013-4547

此漏洞为文件名逻辑漏洞&#xff0c;该漏洞在上传图片时&#xff0c;修改其16进制编码可使其绕过策略&#xff0c;导致解析为 php。当Nginx 得到一个用户请求时&#xff0c;首先对 url 进行解析&#xff0c;进行正则匹配&#xff0c;如果匹配到以.php后缀结尾的文件名&#xff…

JAVA游戏源码:仙剑|大学生练手项目

学习java朋友们&#xff0c;福利来了&#xff0c;今天小编给大家带来了一款仙剑源码。注意&#xff1a;此源码仅供学习使用!! 源码搭建和讲解 启动main入口&#xff1a; //************************************************************************ // ************完整源码…

【practise】大数相加、大数相乘

通常&#xff0c;我们的int、long long类型都有最大的数字上限&#xff0c;也就是说再大了会有溢出问题&#xff0c;那么很大的数字是怎么进行运算的呢&#xff1f; 其中一种方法是把很大的数字转变成字符串存放到string中&#xff0c;然后用代码对字符串进行处理&#xff0c;…

进程通信(7):互斥锁(mutex)和条件变量

互斥锁(mutex)用于互斥访问临界区&#xff0c;只允许一个线程访问共享变量。 条件变量可以让获取互斥锁 的线程在某个条件变量上等待&#xff0c;直到有其他线程把他唤醒。 互斥锁和条件变量通常一起使用实现同步。 互斥锁的操作 lock(mutex)&#xff1b; // 获取锁&#xff…

C++——哈希结构

1.unordered系列关联式容器 本节主要介绍unordered_map和unordered_set两个容器&#xff0c;底层使用哈希实现的 unordered_map 1.unordered_map是储存<key,value>键值对的关联式容器&#xff0c;其允许通过key快速查找到对应的value&#xff0c;和map非常相似&#x…

数学建模--支持向量机

目录 SVM的基本原理 SVM的应用场景 实现细节与案例分析 总结 支持向量机&#xff08;SVM&#xff09;在处理非线性数据时的核函数有哪些&#xff0c;以及它们各自的优缺点是什么&#xff1f; 如何选择支持向量机的惩罚参数CC以优化模型性能和计算效率&#xff1f; 在实际…

V.PS澳大利亚VPS测评

V.PS的澳大利亚VPS位于澳大利亚悉尼市&#xff0c;回程三网强制是走的联通AS9929/CUII链路&#xff0c;是一种轻负载企业级回国路由...而且IP解锁能搞定奈飞、迪士尼、steam、chatgpt等&#xff0c;大洋洲流媒体解锁&#xff0c;尤其是澳大利亚的流媒体&#xff0c;比如澳大利亚…

C语言程序设计-[1] 基础语法

1、字符集 字符集&#xff1a;是ASCII字符集的一个子集。 注&#xff1a;基本上就是电脑键盘可以输入的一些字符。 2、标识符 标识符&#xff1a;用来命名程序中的一些实体&#xff0c;如&#xff1a;变量、常量、函数、数组名、类型名、文件名等。由一个或多个字符组成。 —…