redission java_Java注解如何基于Redission实现分布式锁

这篇文章主要介绍了Java注解如何基于Redission实现分布式锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

1、定义注解类

@Target({ ElementType.METHOD })

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface DistributedLock {

//锁名称

String lockName() default "";

//释放时间

long releaseTime() default 5*1000;

//时间单位

TimeUnit timeUnit() default TimeUnit.MILLISECONDS;

}

2、定义切面拦截 DistributedLock 注解

@Aspect

@Component

@Slf4j

public class DistributedLockAspect {

@Autowired

private RedissonClient redissonClient;

//这里需要修改对应的包名

@Pointcut("@annotation(com.utils.annotation.DistributedLock)")

public void RlockAspect() {

}

@Around("RlockAspect()")

public Object arround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {

Object object = null;

RLock lock = null;

log.info("rlockAspect start ");

try {

DistributedLock rlockInfo = getRlockInfo(proceedingJoinPoint);

String lockKey = getLocalKey(proceedingJoinPoint, rlockInfo);

lock = redissonClient.getLock(lockKey);

if (lock != null) {

final boolean status = lock.tryLock(rlockInfo.releaseTime(), rlockInfo.timeUnit());

if (status) {

object = proceedingJoinPoint.proceed();

}

} else {

log.info("未获取到锁:{}", lockKey);

}

} finally {

// 当前线程获取到锁再释放锁

if (lock != null && lock.isHeldByCurrentThread()) {

lock.unlock();

}

}

return object;

}

public DistributedLock getRlockInfo(ProceedingJoinPoint proceedingJoinPoint) {

MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature();

return methodSignature.getMethod().getAnnotation(DistributedLock.class);

}

/**

* 获取redis lock key

*

* @param proceedingJoinPoint

* @return

*/

public String getLocalKey(ProceedingJoinPoint proceedingJoinPoint, DistributedLock rlockInfo) {

StringBuilder localKey = new StringBuilder("Rlock");

final Object[] args = proceedingJoinPoint.getArgs();

String businessNo = "";

// 如果没有设置锁值

if (StringUtils.isNotEmpty(rlockInfo.lockName())) {

businessNo = rlockInfo.lockName();

} else {

MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature();

Class[] parameters = methodSignature.getParameterTypes();

String methodName = methodSignature.getMethod().getName();

if (parameters != null) {

for (int i = 0; i < parameters.length; i++) {

Class parameter = parameters[i];

if (parameter.getSimpleName().equals("NDevice")) {

NDevice de = (NDevice) args[i];

businessNo = de.getUuid() + methodName;

}

if (parameter.getSimpleName().equals("FrameBean")) {

FrameBean de = (FrameBean) args[i];

businessNo = de.getColumn1() + methodName;

}

}

// 如果没有获取到业务编号,则使用方法签名

if (StringUtils.isEmpty(businessNo)) {

businessNo = methodName;

}

}

}

return businessNo;

}

}

3、使用方法:在需要用分布式锁的方法上面加 @DistributedLock 注解即可

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

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

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

相关文章

Spring Security源码分析四:Spring Social实现微信社交登录

2019独角兽企业重金招聘Python工程师标准>>> 社交登录又称作社会化登录&#xff08;Social Login&#xff09;&#xff0c;是指网站的用户可以使用腾讯QQ、人人网、开心网、新浪微博、搜狐微博、腾讯微博、淘宝、豆瓣、MSN、Google等社会化媒体账号登录该网站。 前言…

jdbc开发优缺点

1&#xff09;优点&#xff1a;简单易学,上手快,非常灵活构建SQL&#xff0c;效率高 2&#xff09;缺点&#xff1a;代码繁琐&#xff0c;难以写出高质量的代码&#xff08;例如&#xff1a;资源的释放&#xff0c;SQL注入安全性等&#xff09; 开发者既要写业务逻辑&#xff0…

java numberformat 方法_Java NumberFormat parse()用法及代码示例

parse(str)方法是java.text.NumberFormat的内置方法&#xff0c;该方法从给定字符串的开头解析文本以产生数字。该方法可能不使用给定字符串的整个文本用法:public Number parse?(String str)参数&#xff1a;该函数接受一个字符串str&#xff0c;其开头应进行分析。返回值&am…

hibernate开发优缺点

1&#xff09;优点&#xff1a;不用写SQL&#xff0c;完全以面向对象的方式设计和访问&#xff0c;不用管底层具体数据库的语法&#xff0c;&#xff08;例如&#xff1a;分页&#xff09;便于理解。 2&#xff09;缺点&#xff1a;处理复杂业务时&#xff0c;灵活度差, 复杂的…

求方程的解 Solve the Equation

为什么80%的码农都做不了架构师&#xff1f;>>> 问题&#xff1a; Solve a given equation and return the value of x in the form of string "x#value". The equation contains only , - operation, the variable x and its coefficient. If there is …

[C#学习] DataAdapter.Fill()分页

查询结果分页是以较小数据子集&#xff08;即页&#xff09;的形式返回查询结果的过程。 它通常用于以易于管理的小块形式向用户显示结果。DataAdapter 提供了通过 Fill 方法的重载来仅返回一页数据的功能。 但是&#xff0c;对于大量的查询结果&#xff0c;它可能并不是首选的…

java流读取字符串_javaIO之字符流是怎么读取的?

最近在看io相关的知识&#xff0c;遇到一些小问题&#xff0c;以下有例子来说明问题&#xff1a;比如&#xff1a;12345 是一个十进制数根据ASCII码找到是 &#xff1a;二进制 00110001 00110010 00110011 00110100 00110101十进制4950515253十六进制 0x310x320x330x340x35文件…

什么是mybatis,mybatis有什么特点

jdbc开发优缺点&#xff1a;http://blog.csdn.net/zengmingen/article/details/51180796 hibernate开发优缺点&#xff1a;http://blog.csdn.net/zengmingen/article/details/51180805 1&#xff09;基于上述二种支持&#xff0c;我们需要在中间找到一个平衡点呢&#xff1f;结…

简易RPC框架实现

写在最前面 PRC(Remote Procedure Call) 远程过程调用。通俗的讲就是程序通过RPC框架调用远程主机的方法就如同调用本地方法一样。Dubbo就是这样一个Rpc框架&#xff0c;本文主要参考Dubbo的设计思路&#xff0c;简易实现了Rpc框架。 本文涉及到知识点包括&#xff1a; Jdk 动态…

kafka java获取topic_通过编程方式获取Kafka中Topic的Metadata信息

如果我们需要通过编程的方式来获取到TopicMetadataRequest请求到 def findLeader(topic: String): Unit {val consumer connect("www.iteblog.com", 9092)val req TopicMetadataRequest(TopicMetadataRequest.CurrentVersion,0, kafkaGroupId, List(topic))val to…

redis java 遍历key_java遍历读取整个redis数据库实例

redis提供了灵活的数据查询方式&#xff0c;最牛的就是key的搜索支持正则表达式。jedis.keys(“*”);表示搜索所有keyjedis.keys(“abc*”)表示搜索开头为abc的key数据遍历了key就能遍历到value。其实就是一个setRedisDO rd new RedisDO();rd.open();Set s rd.jedis.keys(&qu…

js学习

为什么80%的码农都做不了架构师&#xff1f;>>> /* my code */ var gArrSpell [ 1111, 2222, 3333, 4444, 5555, 6666, 7777, 8888, 999999, AAAA, bbbb, cccc, dddd, eeee, fffff ];var gArrSplDmg [11,12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24…

代码在eclipse下不报错,在doc命令行下报错--jar file和runable jar file

今天开发一个小工具&#xff0c;引用了Log4j&#xff0c;来记录日志&#xff0c;在eclipse下运行&#xff0c;代码正常&#xff0c;打包成jar放到doc命令行下运行报错&#xff1a; Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/logging/…

gradle java ide_使用Gradle构建Java项目

使用Gradle构建Java项目这个手册将通过一个简单的Java项目向大家介绍如何使用Gradle构建Java项目。我们将要做什么&#xff1f;我们将在这篇文档航中创建一个简单的Java项目&#xff0c;然后使用Gradle构建它。需要准备什么&#xff1f;预留15分钟空闲时间一件称手的兵器(你最喜…

小马激活软件下载,当心伪小马,有病毒

官方的小马激活软件已经停止更新了&#xff0c;下文是官方停更公告。 http://www.pccppc.com/xiaomajihuo-html 所以小马oem7以后的都不是官方的&#xff0c;包含病毒。重装系统后&#xff0c;一般是先激活系统&#xff0c;再安装杀毒软件&#xff0c;这就给“伪小马激活工具”…

truncate,delete,drop之间的区别

TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同&#xff1a;二者均删除表中的全部行。 但 TRUNCATE TABLE 比 DELETE 速度快&#xff0c;且使用的系统和事务日志资源少。 DELETE 语句每次删除一行&#xff0c;并在事务日志中为所删除的每行记录一项。 TRUNCATE…

三张图搞懂JavaScript的原型对象与原型链

对于新人来说&#xff0c;JavaScript的原型是一个很让人头疼的事情&#xff0c;一来prototype容易与__proto__混淆&#xff0c;二来它们之间的各种指向实在有些复杂&#xff0c;其实市面上已经有非常多的文章在尝试说清楚&#xff0c;有一张所谓很经典的图&#xff0c;上面画了…

python partial_如何在python多处理模块中使用partial函数?

下面是我如何解决这个问题的一个简单例子from functools import partialfrom multiprocessing import Pooldef VariadicLifter(func, args):return func(*args)def func(x,y,z,a):return x2*y3*z4*aif __name__ __main__:func_ partial( func, 500, 1007)lfunc_ partial( Va…

Mybatis中resultMap

MyBatis中在查询进行select映射的时候&#xff0c;返回类型可以用resultType&#xff0c;也可以用resultMap&#xff0c;resultType是直接 表示返回类型的&#xff0c;而resultMap则是对外部ResultMap的引用&#xff0c;但是resultType跟resultMap不能同时存在。 1.resultType …

超简单的mysql多实例布置

一、基本概念mysql下载&#xff1a;http://mirrors.sohu.com/mysql/MySQL-5.5/1、MySQL多实例就是在一台机器上面开启多个不同的端口&#xff0c;运行多个MySQL服务进程。这些MySQL多实例公用一套安装程序&#xff0c;使用不同的(也可以是相同的)配置文件&#xff0c;启动程序&…