[框架系列]-[通用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;

}

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

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

相关文章

Dev-Home:又一个开发人员控制中心神器,微软官方出品!

前两周&#xff0c;微软针对开发人员推出的windows控制中心&#xff1a;Dev-Home&#xff0c;迎来了0.9的预览版&#xff0c;这次重点的更新是支持Window 10了&#xff0c;之前一直都只支持Windows 11。 Dev-Home核心有两个功能&#xff1a;系统监控小组件和Gtihub扩展小组件。…

ISO 14229和UDS:汽车诊断的黄金标准

UDS简介&#xff1a; UDS是Unified Diagnostic Services的缩写&#xff0c;全名统一诊断服务。它是一种用于汽车电子控制单元&#xff08;ECU&#xff09;之间进行诊断和通信的标准协议&#xff0c;属于ISO 14229标准的一部分。 UDS的起源和背景&#xff1a; UDS的起源可以追…

一个处理Range List的面试题解法

大纲 题目解法Rangeaddremove ToolsRangeListaddremove 代码 最近看到一个比较有意思的面试题。题目不算难&#xff0c;但是想把效率优化做好&#xff0c;也没那么容易。 我们先看下题目 题目 // Task: Implement a class named RangeList // A pair of integers define a ra…

【C++】C++中的【文件IO流】使用指南 [手把手代码演示] & [小白秒懂]

前言 大家好吖&#xff0c;欢迎来到 YY 滴 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Linux》…

JavaEE-自定义SSM-编写核心-解析yml文件

3.3.1 加载yml文件 编写yaml工厂&#xff0c;用于加载yml文件 package com.czxy.yaml;import java.io.InputStream;/*** 用于处理 application.yml文件* 1. 加载application.yml文件* 2. yaml工具类进行解析* Map<String, Map<String, Map<....>> >* …

Linux使用二进制包安装MySQL

目录 一、软件包下载 二、上传软件包到Linux根目录 1、使用xftp将软件包上传到根目录 2、解压缩 三、准备工作 四、初始化软件 五、设置MySQL的配置文件 六、配置启动脚本 一、软件包下载 官网下载&#xff1a;MySQL :: Download MySQL Community Server 二、上传软件…

AWTK 开源串口屏开发(8) - 系统设置

AWTK 开源串口屏开发 - 系统设置 系统设置只是一个普通应用程序&#xff0c;不过它会用 默认模型 中一些内置的属性和命令&#xff0c;所以这里专门来介绍一下。 1. 功能 在这个例子会用到 默认模型 中一些下列内置的属性和命令&#xff1a; 内置属性 属性类型说明rtc_yea…

【Unity3D日常开发】Unity3D中设置Text行首不出现标点符号

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在开发中会遇到Text的文本内容行首出现标点符号的情况&#xf…

PyTorch初探:基本函数与案例实践

正文&#xff1a; 在熟悉了PyTorch的安装和环境配置后&#xff0c;接下来让我们深入了解PyTorch的基本函数&#xff0c;并通过一个简单的案例来实践这些知识。 1. 基本函数 PyTorch的核心是张量&#xff08;Tensor&#xff09;&#xff0c;它类似于多维数组&#xff0c;但可以…

Cesium加载地图-高德影像

废话不多说&#xff0c;直接上代码 整体代码 <template><div id"cesiumContainer" style"height: 100vh;"></div><div id"toolbar" style"position: fixed;top:20px;left:220px;"><el-breadcrumb><…

hive面试题

0. 思维导图 1. 简述Hive♥♥ 我理解的&#xff0c;hive就是一款构建数据仓库的工具&#xff0c;它可以就结构化的数据映射为一张表&#xff0c;并且可以通过SQL语句进行查询分析。本质上是将SQL转换为MapReduce或者spark来进行计算&#xff0c;数据是存储在hdfs上&#xff0c;…

【word】论文、报告:①插入图表题注,交叉引用②快速插入图表目录③删改后一键更新

【word】①插入图表题注&#xff0c;②删改后一键更新 写在最前面插入题注交叉引用修改插入题注的文字格式快速插入图表目录 插入题注后有删改&#xff0c;实现编号一键更新 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&#xff0c;感谢你…

ubuntu安装mongod

1、安装 1.1包管理公钥导入 wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -执行结果截图如下&#xff1a; 1.2创建列表文件 lsb_release -dc 根据你的Codename 来修改下方对应的命令&#xff0c;如果你的是jammy&#xff0c;就修改为j…

Hive常见问题汇总

Hive和Hadoop的关系 Hive 构建在 Hadoop 之上&#xff0c; HQL 中对查询语句的解释、优化、生成查询计划是由 Hive 完成的 所有的数据都是存储在 Hadoop 中 查询计划被转化为 MapReduce 任务&#xff0c;在 Hadoop 中执行&#xff08;有些查询没有 MR 任务&#xff0c;如&…

防御保护---安全策略

文章目录 一.安全策略概述 概述&#xff1a; 安全策略的作用&#xff1a; 包过滤防火墙的安全风险 状态检测防火墙访问过程 安全策略与传统防火墙的区别 二.案例分析 基础配置&#xff1a;&#xff08;正常数通&#xff09; 安全策略配置 练习 一.安全策略概述 概述&#xff1…

OpenAI API 的最新动态:新一代的嵌入模型,更新 GPT-4 Turbo,更新 GPT-3.5 Turbo 以及降低 API 价格

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 OpenAI 正在推出新一代嵌入模型、新的 GPT-4 Turbo 和审查模型、新的 API 使用管理工具&#xff0c;而且很快就会降低 GPT-3.5 Turbo 的价格。 OpenAI…

vuepress搭建个人博客以及部署

vuepress&#xff0c;Vue 驱动的静态网站生成器&#xff0c;以 Markdown 为中心的项目结构&#xff0c;以最少的配置帮助你专注于写作。 vuepress官网 vuepress存在很多主题&#xff0c;也可以自定义设计主题&#xff0c;上传npm使用 这里采用vuepress-theme-hope主题模板进行制…

移动端应用(APP)如何设计测试用例?

为 APP 设计测试用例需要考虑移动设备的特殊性&#xff0c;如不同的操作系统、设备尺寸、硬件特性以及应用程序自身的特定功能。 以下是为APP设计测试用例时要考虑的内容&#xff1a; 1. 理解需求 熟悉APP的功能需求、用户故事和设计文档。 确定APP的目标用户群体、使用场景…

Leetcode刷题笔记题解(C++):1114. 按序打印(多线程)

思路&#xff1a; 保证A,B,C三个线程的顺序不会变&#xff0c;即优先级顺序的问题 A,B需要资源1&#xff0c;B,C需要资源2 A先占用资源1和资源2&#xff0c;A线程完了之后释放资源1不释放资源2&#xff0c;然后B线程占用资源1&#xff0c;A线程完了之后释放资源1和资源2&…

C++ 11 多线程库初步学习

在C11标准中&#xff0c;可以简单通过使用thread库&#xff0c;来管理多线程。 thread库可以看做对不同平台多线程API的一层包装&#xff1b;因此使用新标准提供的线程库编写的程序是跨平台的。 使用时需要#include <thread>头文件&#xff1b; #include <iostream&g…