最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java注解如何基于Redission實(shí)現(xiàn)分布式鎖

 更新時(shí)間:2020年01月15日 11:21:31   作者:深藏的豆沙包  
這篇文章主要介紹了Java注解如何基于Redission實(shí)現(xiàn)分布式鎖,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這篇文章主要介紹了Java注解如何基于Redission實(shí)現(xiàn)分布式鎖,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

1、定義注解類(lèi)

@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DistributedLock {
  //鎖名稱(chēng)
  String lockName() default "";

  //釋放時(shí)間
  long releaseTime() default 5*1000;

  //時(shí)間單位
  TimeUnit timeUnit() default TimeUnit.MILLISECONDS;
}

2、定義切面攔截 DistributedLock 注解

@Aspect
@Component
@Slf4j
public class DistributedLockAspect {

  @Autowired
  private RedissonClient redissonClient;
   //這里需要修改對(duì)應(yīng)的包名
  @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 {
      // 當(dāng)前線程獲取到鎖再釋放鎖
      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 = "";

    // 如果沒(méi)有設(shè)置鎖值
    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;
          }
        }
        // 如果沒(méi)有獲取到業(yè)務(wù)編號(hào),則使用方法簽名
        if (StringUtils.isEmpty(businessNo)) {
          businessNo = methodName;
        }
      }
    }
    return businessNo;
  }
}

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring靜態(tài)代理和動(dòng)態(tài)代理代碼詳解

    Spring靜態(tài)代理和動(dòng)態(tài)代理代碼詳解

    這篇文章主要介紹了Spring靜態(tài)代理和動(dòng)態(tài)代理代碼詳解,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • SpringBoot使用@Autowired為多實(shí)現(xiàn)的接口注入依賴(lài)

    SpringBoot使用@Autowired為多實(shí)現(xiàn)的接口注入依賴(lài)

    這篇文章主要介紹了SpringBoot使用@Autowired為多實(shí)現(xiàn)的接口注入依賴(lài),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java編程線程同步工具Exchanger的使用實(shí)例解析

    Java編程線程同步工具Exchanger的使用實(shí)例解析

    這篇文章主要介紹了Java編程線程同步工具Exchanger的使用實(shí)例解析,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • Springboot3+Redis實(shí)現(xiàn)消息隊(duì)列的多種方法小結(jié)

    Springboot3+Redis實(shí)現(xiàn)消息隊(duì)列的多種方法小結(jié)

    本文主要介紹了Springboot3+Redis實(shí)現(xiàn)消息隊(duì)列的多種方法小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • gateway網(wǎng)關(guān)與前端請(qǐng)求跨域問(wèn)題的解決方案

    gateway網(wǎng)關(guān)與前端請(qǐng)求跨域問(wèn)題的解決方案

    這篇文章主要介紹了gateway網(wǎng)關(guān)與前端請(qǐng)求跨域問(wèn)題的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • spring?項(xiàng)目實(shí)現(xiàn)限流方法示例

    spring?項(xiàng)目實(shí)現(xiàn)限流方法示例

    這篇文章主要為大家介紹了spring項(xiàng)目實(shí)現(xiàn)限流的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 一篇文章帶你入門(mén)Java運(yùn)算符

    一篇文章帶你入門(mén)Java運(yùn)算符

    這篇文章主要介紹了Java基本數(shù)據(jù)類(lèi)型和運(yùn)算符,結(jié)合實(shí)例形式詳細(xì)分析了java基本數(shù)據(jù)類(lèi)型、數(shù)據(jù)類(lèi)型轉(zhuǎn)換、算術(shù)運(yùn)算符、邏輯運(yùn)算符等相關(guān)原理與操作技巧,需要的朋友可以參考下
    2021-08-08
  • 三道java新手入門(mén)面試題,通往自由的道路--鎖+Volatile

    三道java新手入門(mén)面試題,通往自由的道路--鎖+Volatile

    這篇文章主要為大家分享了最有價(jià)值的3道多線程面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,對(duì)hashCode方法的設(shè)計(jì)、垃圾收集的堆和代進(jìn)行剖析,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Java 排序算法整合(冒泡,快速,希爾,拓?fù)?,歸并)

    Java 排序算法整合(冒泡,快速,希爾,拓?fù)?,歸并)

    這篇文章主要介紹了Java 排序算法整合(冒泡,快速,希爾,拓?fù)洌瑲w并),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • skywalking分布式服務(wù)調(diào)用鏈路追蹤APM應(yīng)用監(jiān)控

    skywalking分布式服務(wù)調(diào)用鏈路追蹤APM應(yīng)用監(jiān)控

    這篇文章主要為大家介紹了skywalking分布式服務(wù)調(diào)用鏈路追蹤APM應(yīng)用監(jiān)控的功能使用說(shuō)明,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-03-03

最新評(píng)論

彭州市| 景泰县| 东山县| 乡城县| 舒城县| 寻乌县| 新干县| 潼南县| 罗山县| 腾冲县| 凤凰县| 江西省| 周宁县| 河东区| 乌拉特后旗| 和顺县| 德清县| 赣州市| 海淀区| 彩票| 南陵县| 南和县| 崇明县| 东光县| 璧山县| 赞皇县| 华容县| 张家港市| 铁岭县| 都江堰市| 万山特区| 巫溪县| 塘沽区| 韶山市| 克山县| 军事| 云南省| 佛教| 溧阳市| 连州市| 和龙市|