[框架系列]-[通用lock框架]集成及具体配置使用

目录

一:框架集成

1.添加pom依赖

2.开启lock配置

二:配置详细介绍

1.配置清单

2.具体配置介绍

(1)implementer

(2)type

(3)transactionStrategy

(4)lockFailStrategy

(5)lockExceptionStrategy

(6)releaseTimeoutStrategy

三:CUSTOMER的SPI扩展示例

1.SPI扩展点

2.使用示例

四:代码示例

1.代码方式

2:注解方式示例

(1).方法头部同时存在@Transactional及@Lock时

(2).@LockKey的使用

(3).快捷注解的使用

4().自定义快速失败时,抛出的异常类型及异常信息(可单独设置)

(5).定制上锁失败策略


一:框架集成

1.添加pom依赖

<dependency>

   <groupId>com.ty</groupId>

   <artifactId>ty-framework-lock-starter</artifactId>

   <version>0.2.9</version>

</dependency>

2.开启lock配置

目前分布式锁仅支持redis实现

application.yml示例:

application:

  lock:

    enable: true

spring:

  redis:

    database: 3

    cluster:

      nodes: 192.168.xx.xxx:6479,192.168.xx.xxx:6479,192.168.xx.xxx:6479

    password: 12345678

application.properties示例:

application.lock.enable=true

#redis集群版配置示例,其他版本配置具体见Spring redis相关配置

spring.redis.database=3

spring.redis.cluster.nodes=192.168.xx.xxx:6479,192.168.xx.xxx:6479,192.168.xx.xxx:6479

spring.redis.password=12345678

如遇到集成问题,可联系@苏友良

二:配置详细介绍

1.配置清单

配置名

配置简介

默认值

作用域

其他

enable

是否开启

Boolean.FALSE

全局

使用需开启此配置

implementer

lock厂商实现类型

LockImplementer.REDIS

全局及注解

redis实现

type

lock 的类型

LockType.Reentrant

全局及注解

keys

自定义业务key(支持SpingEL)

注解

系统会按照${name}:${key1}:...:${keyN}:${@LockKey1}:...:${@LockKeyN}的方式拼接,作为lock的key

特殊的:当name,keys以及注解@LockKey都为空时,系统默认使用方法的全限定类名作为key(不推荐使用此方式)

name

锁的名称

注解

系统会按照${name}:${key1}:...:${keyN}:${@LockKey1}:...:${@LockKeyN}的方式拼接,作为lock的key

特殊的:当name,keys以及注解@LockKey都为空时,系统默认使用方法的全限定类名作为key(不推荐使用此方式)

supportTransaction

是否支持上下文感知

Boolean.TRUE

全局及注解

withLocalCache

是否支持本地lock二级缓存

Boolean.FALSE

全局及注解

transactionStrategy

仅开启supportTransaction生效

LockTransactionStrategy.WARMING

全局

打warm日志

waitTime

等待时间

2s

全局及注解

leaseTime

等待时间

60s

全局及注解

此参数在Lock官方定义中不生效,可通过自定义LockAdapter使用该参数。redis实现中默认此参数不生效(自动续期机制),如方言需使用此参数参考:cn.techwolf.blue.usl.framework.lock.factory.support.RedissonLockAdapterFactory

lockFailStrategy

加锁失败的处理策略

FailOnLockStrategy.FAIL_FAST

全局及注解

快速失败

exceptionOnLockStrategy

加锁异常的处理策略

ExceptionOnLockStrategy.THROW_EXCEPTION

全局及注解

抛出异常

releaseTimeoutStrategy

释放锁时异常的处理策略

ReleaseTimeoutStrategy.FAIL_FAST

全局及注解

快速失败

exceptionClass

获取锁失败时,报错的异常类型

LockException

全局及注解

获取锁失败时,报错的异常类型
1.仅当LockFailStrategy.FAIL_FAST或者ReleaseTimeoutStrategy.FAIL_FAST 生效 此处设置二者都会生效
2.优先级:注解exceptionClass>lockConfig exceptionClass>系统默认
3.示例:cn.techwolf.blue.usl.framework.common.exception.FrameworkException
4.注意:必须是RuntimeException的子类

exceptionMsg

获取锁失败时,报错的错误信息

Failed to acquire Lock(%s) with timeout(%d ms)

全局及注解

仅当LockFailStrategy.FAIL_FAST或者ReleaseTimeoutStrategy.FAIL_FAST生效此处设置二者都会生效
优先级:注解exceptionClass>lockConfig exceptionClass>系统默认

customLockFailStrategy定制的加锁失败的处理策略注解用户指定,定义的方法参数需要和注解所在的方法参数保持一致
此方式与lockFailStrategy中的CUSTOM不同点在于:此方式可对方法具体参数做定制化的处理策略,
后者更适合做全局的默认处理
customReleaseTimeout
Strategy
定制的释放锁时异常的处理策略注解

用户指定,定义的方法参数需要和注解所在的方法参数保持一致

此方式与releaseTimeoutStrategy中的CUSTOM不同点在于:此方式可对方法具体参数做定制化的处理策略,后者更适合做全局的默认处理

注解配置优先级大于全局配置。仅当注解没有配置才会使用全局配置

2.具体配置介绍
(1)implementer

提供的厂商实现:

  • JVM 本地JVM实现
  • REDIS redis实现 
  • ZOOKEEPER zookeeper实现
  • ETCD etcd实现
  • MYSQL mysql实现

具体见:cn.techwolf.blue.usl.framework.lock.config.LockConfig.LockImplementer

(2)type

lock厂商实现类型:

  • Reentrant 可重入锁

  • Fair 公平锁
  • Read 读锁
  • Write 写锁
  • Spin 自旋锁

具体见:cn.techwolf.blue.usl.framework.lock.enums.LockType

(3)transactionStrategy

当lock存在于事务上下文中的策略(仅开启supportTransaction生效):

  • WAARMING  打warming日志
  • FORBIDDEN 禁止,会抛出异常阻断业务逻辑
  • THREAD_SAFE 保证多线程访问安全,unlock会在事务完成后再提交。缺点:会使lock的作用域膨胀。直至上下文事务完成
(4)lockFailStrategy

加锁失败的处理策略:

  • NO_OPERATION:继续执行业务逻辑,不做任何处理
  • FAIL_FAST:快速失败
  • KEEP_ACQUIRE:一直阻塞,直到获得锁,在太多的尝试后,仍会报错
  • CUSTOMER: 自定义,用于全局默认处理
(5)lockExceptionStrategy

加锁异常的处理策略:

  • THROW_EXCEPTION:抛出异常
  • CUSTOMER:自定义,用于全局默认处理

(6)releaseTimeoutStrategy

释放锁时报错的处理策略:

  • NO_OPERATION:继续执行业务逻辑,不做任何处理
  • FAIL_FAST:快速失败,可自定义异常类及报错信息
  • CUSTOMER: 自定义,用于全局默认处理

三:CUSTOMER的SPI扩展示例

1.SPI扩展点

以上的策略中,lockFailStrategy,lockExceptionStrategy,releaseTimeoutStrategy 都提供了CUSTOMER的的策略,框架通过java的SPI机制,将对应的用户自实现的策略加载

策略点

策略名

具体配置名

扩展定义接口

加锁失败的处理策略lockFailStrategyCUSTOMERcn.techwolf.blue.usl.framework.lock.handler.lock.ExceptionOnLockCustomerHandler
加锁异常的处理策略lockExceptionStrategyCUSTOMERcn.techwolf.blue.usl.framework.lock.handler.lock.FailOnLockCustomerHandler
加锁释放锁异常的处理策略releaseTimeoutStrategyCUSTOMERcn.techwolf.blue.usl.framework.lock.handler.release.ReleaseTimeoutCustomerHandler
2.使用示例

这里以ExceptionOnLockCustomerHandler 作为示例

(1)在resources文件夹下创建文件夹META-INF/services

(2)在META-INF/services中添加file,名称为扩展的Handler的全限定类名

(3)文件中填写自己基于定义的接口的实现类的全限定类名

自定义处理策略加载后,如果需要指定为全局,需要在全局配置中指定定位的策略名的配置为CUSTOMER即可开启,方法级(或者注解)同理

注意:无论是全局还是注解的方法级,一旦指定以上策略的配置为CUSTOMER,则系统运行时必须存在对应的实现类,否则报错。不同的是,全局级配置报错将导致项目无法启动

四:代码示例

1.代码方式

@Autowired

LockRegistry lockRegistry;

public void testApi() throws Exception {

    Lock lock = lockRegistry.obtain("aaa");

    try {

        boolean b = lock.tryLock(2, TimeUnit.SECONDS);

        if (b){

            //do your business code

        }

    }finally {

        lock.unlock();

    }

}

2:注解方式示例
(1).方法头部同时存在@Transactional及@Lock时

@Lock(waitTime = 10, keys = {"#param"}, timeUnit = TimeUnit.SECONDS, lockFailStrategy = FailOnLockStrategy.FAIL_FAST)

@Transactional

public String getValue(String param) throws Exception {

    if ("sleep".equals(param)) {//线程休眠或者断点阻塞,达到一直占用锁的测试效果

        Thread.sleep(100 10);

    }

    return "success";

}

其中:当方法存在@Transactional时,@Lock方法将在 @Transactional之后执行,即:事务开启前上锁,事务关闭后解锁。与两个注解的上下顺序无关

(2).@LockKey的使用

@Lock(keys = {"#userId"})

public String getValue(String userId, @LockKey Integer id) throws Exception {

    Thread.sleep(60 10);

    return "success";

}

按照${name}:${key1}:...:${keyN}:${@LockKey1}:...:${@LockKeyN}的拼接逻辑  以上示例的key:${userId}:${id}

(3).快捷注解的使用

@FailFastLock(keys = {"#user.id"})

public String getValueWithFailFastLock(User user) {

    try {

        Thread.sleep(1000);

    catch (InterruptedException e) {

        e.printStackTrace();

    }

    return "success";

}

@LocalLock(keys = {"#user.id"})

public String getValueWithLocalLock(User user) {

    try {

        Thread.sleep(1000);

    catch (InterruptedException e) {

        e.printStackTrace();

    }

    return "success";

}

@FailFastLock 快速失败的锁,无需设置等待时间,等待时间为0s

@LocalLock 本地jvm实现的锁

4().自定义快速失败时,抛出的异常类型及异常信息(可单独设置)

@Lock(name = "foo-service", waitTime = 1, exceptionClass = "techwolf.blue.usl.framework.springboot.lock.test.customer.exception.CustomerException",exceptionMsg = "我是注解自定义异常信息")

public void foo10() {

    try {

        log.info("acquire lock");

        TimeUnit.SECONDS.sleep(2);

    catch (InterruptedException e) {

        e.printStackTrace();

    }

}

(5).定制上锁失败策略

如果指定的customLockFailStrategy方法在本类外部,使用全限定名称

@Lock(name = "foo-service",waitTime = 2,customLockFailStrategy = "customLockTimeout")

public String foo4(String foo, String bar) {

    try {

        TimeUnit.SECONDS.sleep(2);

        log.info("acquire lock");

    catch (InterruptedException e) {

        e.printStackTrace();

    }

    return "foo4";

}

private String customLockTimeout(String foo, String bar) {

    return "custom foo:" + foo + " bar:" + bar;

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

利用大模型审合同真的可以吗?

#大模型 #大模型审合同 最近有很多朋友留言&#xff0c;询问关于大模型审合同的问题&#xff0c;今天就小智一起来探讨下这个问题。 &#xff08;智合同-采用深度学习、自然语言处理技术、知识图谱等人工智能技术&#xff0c;为企业提供专业的合同相关的智能服务。其服务包含…

【Java IO】设计模式 (装饰者模式)

Java I/O 使用了装饰者模式来实现。 装饰者模式 请参考装饰者模式详解 装饰者(Decorator)和具体组件(ConcreteComponent)都继承自组件(Component)&#xff0c;具体组件的方法实现不需要依赖于其它对象&#xff0c;而装饰者组合了一个组件&#xff0c;这样它可以装饰其它装饰者…

Excel数据检索省力小工具(文末附源码)

Excel数据检索省力小工具&#xff08;文末附源码&#xff09; 引言 ​ 相信很多人都是用过VLOOKUP函数来检索和处理Excel数据。比如教师查看班级学生成绩表&#xff0c;想单独检索某个科目、某个学生&#xff0c;某一分数段&#xff08;80~90分数段内的成绩&#xff09;&…

网络安全基础概念

目录 网络安全背景 网络空间安全 --- Cyberspace 常见的网络安全术语 协议栈自身的脆弱性&#xff1a; 常见安全风险&#xff1a; 物理层--物理攻击 物理设备窃听&#xff1a; 链路层-- MAC洪泛攻击&#xff1a; 链路层--ARP欺骗 网络层--ICMP攻击 传输层--TCP SYN Flood攻击: …

信息检索与数据挖掘 | (八)语言建模的IR

文章目录 &#x1f4da;语言生成模型&#x1f4da;平滑&#x1f407;线性插值平滑方法(Lelinek-Mercer)&#x1f407;dirichlet 平滑&#x1f407;Vector space&#xff08;向量空间&#xff09; vs BM25 vs LM &#x1f4da;语言生成模型 传统的语言生成模型可以用于识别或生成…

南京观海微电子---时序分析基本概念(二)——保持时间

1. 概念的理解 以上升沿锁存为例&#xff0c;保持时间&#xff08;Th&#xff09;是指在触发器的时钟信号上升沿到来以后&#xff0c;数据稳定不变的时间。如下图所示&#xff0c;一个数据要在上升沿被锁存&#xff0c;那么这个数据需要在时钟上升沿到来后的保持时间内保持稳定…

展会日记:ICCAD2023,Samtec连接器无处不在

【序言】 “作为重要的电子元器件&#xff0c;连接器在如今的数字与现实世界中&#xff0c;扮演了不可或缺的角色。Samtec作为全球知名的连接器厂商&#xff0c;在芯片到板、板到板、射频、光模块等领域都有着卓越表现~ 今年&#xff0c;我们更是将这种存在感在2023 ICCAD上&a…

Nginx 基础使用

目录结构 进入Nginx的主目录我们可以看到这些文件夹 client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp其中这几个文件夹在刚安装后是没有的&#xff0c;主要用来存放运行过程中的临时文件 client_body_temp fastcgi_temp proxy_temp scg…

uniapp中打包Andiord app,在真机调试时地图以及定位功能可以正常使用,打包成app后失效问题(高德地图)

踩坑uniapp中打包Andiord app&#xff0c;在真机调试时地图以及定位功能可以正常使用&#xff0c;打包成app后失效问题_uniapp真机调试高德地图正常 打包apk高德地图就不加载-CSDN博客 问题&#xff1a; 目前两个项目&#xff0c;一个项目是从另一个项目里面分割出来的一整套…

华为云磁盘性能指标(参考)

MD[华为云磁盘性能指标(参考)] 云硬盘&#xff08;Elastic Volume Service, EVS&#xff09; 根据性能&#xff0c;磁盘可分为极速型SSD V2、极速型SSD、通用型SSD V2、超高IO、通用型SSD、高IO、普通IO。 性能指标(参考)&#xff0c;测速说明&#xff1a;操作系统-windows …

共襄Agent智能体盛举,实在智能2024生态伙伴大会杭州站圆满收官!

1月19日&#xff0c;以“实在Agent智能体”为主题的「2024实在智能生态伙伴大会&#xff08;杭州站&#xff09;」在杭州人工智能小镇隆重启幕&#xff01; 中国电信/联通/中海油等数十家央企子公司领导代表、天翼数科/华为/浪潮/统信/贝锐/vivo集团/新华三/中软国际/中投创展/…

华为AC+FIT AP组网配置

AC配置 vlan batch 100 to 101dhcp enableip pool apgateway-list 192.168.100.254 network 192.168.100.0 mask 255.255.255.0 interface Vlanif100ip address 192.168.100.254 255.255.255.0dhcp select globalinterface GigabitEthernet0/0/1port link-type trunkport trun…

Flutter 自定义AppBar实现滚动渐变

1、使用ListView实现上下滚动。 2、使用Stack&#xff1a;允许将其子部件放在彼此的顶部&#xff0c;第一个子部件将放置在底部。所以AppBar&#xff0c;写在ListView下面。 3、MediaQuery.removePadding&#xff1a;当使用ListView的时候发现&#xff0c;顶部有块默认的Padd…

【蓝桥杯冲冲冲】排队接水--贪心算法巩固 (≧∇≦)

蓝桥杯备赛 | 洛谷做题打卡day15 文章目录 蓝桥杯备赛 | 洛谷做题打卡day15排队接水题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路 题解代码我的一些话 排队接水 题目描述 有 n n n 个人在一个水龙头前排队接水&#xff0c;假如每个人接水的时间为 T i T_…

使用torch实现RNN

在实验室的项目遇到了困难&#xff0c;弄不明白LSTM的原理。到网上搜索&#xff0c;发现LSTM是RNN的变种&#xff0c;那就从RNN开始学吧。 带隐藏状态的RNN可以用下面两个公式来表示&#xff1a; 可以看出&#xff0c;一个RNN的参数有W_xh&#xff0c;W_hh&#xff0c;b_h&am…

Linux如何将文件或目录打成rpm包? -- fpm打包详解

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

关于大模型学习中遇到的4

来源&#xff1a;网络 相关学习可查看文章&#xff1a;Transformer and Pretrain Language Models3-4​​​​​​​ 什么是MLP? MLP是多层感知器&#xff08;Multilayer Perceptron&#xff09;的缩写&#xff0c; 多层感知机&#xff08;MLP&#xff09;是一种人工神经网…

Tensorflow2.0笔记 - tensor的合并和分割

主要记录concat,stack,unstack和split相关操作的作用 import tensorflow as tf import numpy as nptf.__version__#concat对某个维度进行连接 #假设下面的tensor0和tensor1分别表示4个班级35名同学的8门成绩和两个班级35个同学8门成绩 tensor0 tf.ones([4,35,8]) tensor1 tf…

基于SpringBoot Vue医院门诊管理系统

大家好✌&#xff01;我是Dwzun。很高兴你能来阅读我&#xff0c;我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结&#xff0c;还为大家分享优质的实战项目&#xff0c;本人在Java项目开发领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#x…

[zookeeper] SASL(Simple Authentication and Security Layer) 用户名密码认证配置

使用zookeeper zkCli.sh 连接 zookeeper服务时&#xff0c;默认裸连&#xff0c;晓得ip与端口之后即可连接zookeeper服务&#xff0c;本文使用SASL 用户名密码配置服务端与客户端&#xff0c;在zkCli连接前&#xff0c;服务端配置xxxjaas.conf保存用户名密码&#xff0c;客户端…