@SchedulerLock注解使用

news2024/11/24 17:18:53

文章目录

  • @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 {
    @Autowired
    private DataSource dataSource;
    @Bean
    public 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.coloradmin.cn/o/1972621.html

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

相关文章

写文案的软件有哪些,四款强大的文案生成器为你创作文案

文案,作为沟通和营销的桥梁,其重要性不言而喻。然而,创作出既吸引人又具有说服力的文案,往往需要投入大量的时间和精力。随着市场上出现了一些能够辅助甚至替代人工创作文案的生成器出现,它解决了大家创作文案的难题。…

(器件)ATMXT1664S1是电容式触摸屏控制器、而ATMXT2912TG-A则是maXTouch 2840节点触摸屏控制器

1、maXTouch mXT1664S电容式触摸屏控制器为大型触摸屏设备带来了S系列架构。mXT1664S得益于强大的32位AVR内核,并且由于S系列架构,它具有业界最高的信噪比(SNR),提供了无与伦比的触摸性能。与S系列中的其他设备一样,mXT1664S包括:…

在OA系统中,飞书的设计从颜值和体验上算是天花板了吧?

书是一款优秀的企业通讯协作工具,在 OA 系统的设计上有很多优点,如用户界面友好、安全性高和协作功能丰富等。但它也有一些可以改进的地方,以下是一些可能的方向: 用户体验一致性:飞书的不同功能模块可能在用户体验上…

TCP的可靠机制

TCP的可靠机制 前言 要了解TCP的可靠机制,我们必须要先熟悉TCP的报文,在这篇文章中有详细介绍TCP的报文 : 并且确认应答机制也在该文章中提到,所以这篇文章就不会再介绍确认应答了。 超时重传 我们都知道,报文在网…

2024年【起重机司机(限桥式起重机)】最新解析及起重机司机(限桥式起重机)找解析

题库来源:安全生产模拟考试一点通公众号小程序 起重机司机(限桥式起重机)最新解析根据新起重机司机(限桥式起重机)考试大纲要求,安全生产模拟考试一点通将起重机司机(限桥式起重机)模拟考试试题进行汇编,组成一套起重机司机(限桥式起重机)全…

c++(模版)

目录 函数模板格式 函数模版原理 函数模板的实例化 模板参数的匹配原则 类模板 函数模板格式 template<typename T1, typename T2,......,typename Tn> 返回值类型 函数名(参数列表){} template<typename T> void Swap( T& left, T& right) { T te…

cesium的flyTo在飞行完成后渲染

viewer.camera.flyTo({}); 替换自己要渲染的labe img等 viewer.camera.flyTo({destination: Cesium.Cartesian3.fromDegrees(lon,lat,height), // 飞行目的地&#xff0c;视角高度duration: 3, // 飞行所用时间// 飞行完成后的事件complete: function() {viewer.camera.flyTo…

pytorch: cpu,cuda,tensorRt 推理对比学习

0&#xff1a;先看结果 针对resnet模型对图片做处理 原图结果 分别使用cpu&#xff0c;cuda&#xff0c;TensorRt做推理&#xff0c;所需要的时间对比 方法时间cpu13s594mscuda711mstensorRt 113ms 项目地址&#xff1a; GitHub - july1992/Pytorch-vily-study: vily 学…

KubeVirt虚拟机存储及网络卸载加速解决方案

1. 方案背景 1.1. KubeVirt介绍 随着云计算和容器技术的飞速发展&#xff0c;Kubernetes已成为业界公认的容器编排标准&#xff0c;为用户提供了强大、灵活且可扩展的平台来部署和管理各类应用。然而&#xff0c;在企业的实际应用中&#xff0c;仍有许多传统应用或遗留系统难…

电脑缺少directx怎么办?电脑dll修复详细教程!7种方法!

DLL&#xff08;动态链接库&#xff09;文件是Windows操作系统中非常重要的组成部分&#xff0c;它们包含了程序运行所需的代码和数据。然而&#xff0c;由于各种原因&#xff0c;如系统更新、软件卸载不当或病毒感染&#xff0c;DLL文件有时会丢失或损坏&#xff0c;导致程序无…

day18 Java流程控制——Scanner进阶使用

day18 Java流程控制——Scanner进阶使用 本章目录 day18 Java流程控制——Scanner进阶使用1. 什么是Scanner&#xff1f;2. Scanner进阶使用&#xff08;实例&#xff09;2.1 整数&小数的输入输出2.2 我们可以输入多个数字&#xff0c;并求其总和与平均数&#xff0c;每输入…

96年高中程序员年收入30万

互联网创业交流群&#xff0c;从昨天晚上8.1建军节开始建群&#xff0c;到今天中午已经突破200人了。 这里面有我的朋友&#xff0c;也有马总的朋友&#xff0c;当然不管是谁的朋友&#xff0c;进来了大家都是一家人。 以后在不违反原则的情况下&#xff0c;希望大家能和谐相…

建筑业数据挖掘:Scala爬虫在大数据分析中的作用

数据的挖掘和分析对于市场趋势预测、资源配置优化、风险管理等方面具有重要意义&#xff0c;特别是在建筑业这一传统行业中。Scala&#xff0c;作为一种强大的多范式编程语言&#xff0c;提供了丰富的库和框架&#xff0c;使其成为开发高效爬虫的理想选择。本文将探讨Scala爬虫…

《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 03 云原生网络操作系统

本章要回答的问题&#xff1a; 云原生网络操作系统的主要需求是什么?什么是 OpenFlow 和软件定义网络? 它们适用什么样的场景?网络解耦中网络操作系统有哪些可能的选择?这些模型与云原生 NOS 的需求相比是怎样的? 网络设备的新需求 云原生时代中网络设备需要满足以下要求…

揭秘对话式搜索中的广告检测——Detecting Generated Native Ads in Conversational Search

Detecting Generated Native Ads in Conversational Search | Companion Proceedings of the ACM on Web Conference 2024https://dl.acm.org/doi/abs/10.1145/3589335.3651489 1. 概述 大型语言模型(LLMs)已成为构建对话式搜索引擎与检索增强生成系统的主流标准。然而,在大…

python packages是什么意思

package指的就是包&#xff0c;它是一个有层次的文件目录结构&#xff0c;它定义了由n个模块或n个子包组成的python应用程序执行环境。通俗一点&#xff1a;包是一个包含__init__.py 文件的目录&#xff0c;该目录下一定得有这个__init__.py文件和其它模块或子包。 但是这会分…

【传知代码】疯狂交互学习的BM3推荐算法(论文复现)

在当今信息爆炸的时代&#xff0c;我们每天接触的数据量已经超出我们大脑的处理能力。在这个背景下&#xff0c;个性化推荐系统以其独特的能力和智能化的算法引起了广泛关注。其中&#xff0c;基于行为的推荐系统成为了引领潮流的前沿技术之一&#xff0c;本文将深入探讨疯狂交…

未来已来:AI在提升企业客户服务质量与效率中的应用

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;其在企业客户服务领域的应用正以前所未有的速度改变着我们的服务模式。AI技术的引入&#xff0c;不仅极大地提升了客户服务的效率&#xff0c;还显著提高了客户满意度&#xff0c;为企业创造了新的竞争优势。…

【kubernetes】kubeadm部署k8s集群

1、环境准备 master01: 192.168.10.25master02: 192.168.10.26master03: 192.168.10.27node01: 192.168.10.28node02: 192.168.10.29负载均衡器1&#xff1a;192.168.10.30负载均衡器2&#xff1a;192.168.10.31 //所有节点&#xff0c;关闭防火墙规则&#xff0c;关闭selinu…

秋招突击——算法训练——8/1——用友集团笔试

文章目录 引言正文小友的生产线个人实现参考实现 小友策划游戏人物个人实现参考实现 最佳工作任务安排个人实现参考实现 大众评分最高的一次旅程 总结 引言 今天晚上七点钟到九点钟是用友集团的笔试&#xff0c;作为今天算法练习的主要内容&#xff01;具体怎么样&#xff0c;…