yubin 1 nedēļu atpakaļ
vecāks
revīzija
297cf084de

+ 7 - 4
mall-service/src/main/java/com/txz/mall/controller/i18nTestController.java

@@ -7,6 +7,7 @@ import com.txz.mall.core.ResultCode;
 import com.txz.mall.core.ServiceException;
 import com.txz.mall.model.StoreCombination;
 import com.txz.mall.util.I18nUtil;
+import com.txz.mall.util.RedissonLockUtil;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import org.redisson.api.RLock;
@@ -50,13 +51,15 @@ public class i18nTestController {
     public String redisson1() {
 
         RLock lock = redissonClient.getLock("lala");
+
+        RedissonLockUtil.tryLock("stock:100:lock", 20, 30);
         lock.lock();
         try {
             Thread.sleep(8000);
         } catch (InterruptedException e) {
             throw new RuntimeException(e);
         }
-        lock.unlock();
+        RedissonLockUtil.unlock("stock:100:lock");
 
         return "success1";
     }
@@ -64,10 +67,10 @@ public class i18nTestController {
     @ApiOperation(value = "redisson2")
     @GetMapping(value = "/redisson2")
     public String redisson2() {
-        RLock lock = redissonClient.getLock("lala");
-        lock.lock();
+        RedissonLockUtil.tryLock("stock:100:lock", 3, 30);
+
 
-        lock.unlock();
+        RedissonLockUtil.unlock("stock:100:lock");
         return "success2";
     }
 

+ 3 - 1
mall-service/src/main/java/com/txz/mall/util/EasyToUseUtil.java

@@ -9,6 +9,7 @@ import com.txz.mall.core.UserUtil;
 import com.txz.mall.dubbo.client.CifUserDubboServiceClient;
 import com.txz.mall.model.MidFavorite;
 import com.txz.mall.web.param.TopLevelEntity;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.ss.formula.functions.T;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -20,8 +21,9 @@ import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
 import java.util.Date;
 @Component
+@Slf4j
 public class EasyToUseUtil {
-    private static Logger log = LoggerFactory.getLogger(EasyToUseUtil.class);
+
     @Resource
     private  CifUserDubboServiceClient cifUserDubboServiceClient;
 

+ 1 - 1
mall-service/src/main/java/com/txz/mall/util/I18nUtil.java

@@ -45,7 +45,7 @@ public class I18nUtil
             ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
             String header = sra.getRequest().getHeader("accept-language");
             LocaleContextHolder.setLocale(Locale.US);
-            if(ObjectUtils.isEmpty(header)) {
+            if(!ObjectUtils.isEmpty(header)) {
                 if ("en".equals(header)) {
                     LocaleContextHolder.setLocale(Locale.US);
                 } else if ("zh".equals(header)) {

+ 122 - 0
mall-service/src/main/java/com/txz/mall/util/RedissonLockUtil.java

@@ -0,0 +1,122 @@
+package com.txz.mall.util;
+
+import lombok.extern.slf4j.Slf4j;
+
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.stereotype.Component;
+
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.util.concurrent.TimeUnit;
+@Slf4j
+@Component
+public class RedissonLockUtil {
+
+
+    @Resource
+    private RedissonClient redissonClient;
+
+    private static RedissonLockUtil instance;
+
+
+    private RedissonLockUtil() {}
+
+
+    @PostConstruct
+    public void init() {
+        instance = this;
+    }
+    /**
+     * 获取分布式锁(阻塞式,直到获取锁为止)
+     * @param lockKey 锁的唯一标识
+     * @return 锁对象
+     */
+    public static RLock getLock(String lockKey) {
+        RLock lock = instance.redissonClient.getLock(lockKey);
+        try {
+            // 尝试获取锁,一直阻塞直到获取成功
+            lock.lock();
+            log.info("获取锁成功,lockKey: {}", lockKey);
+        } catch (Exception e) {
+            log.error("获取锁失败,lockKey: {}, 异常: {}", lockKey, e.getMessage());
+            throw new RuntimeException("获取分布式锁失败", e);
+        }
+        return lock;
+    }
+
+    /**
+     * 获取分布式锁(带超时,超过时间未获取则放弃)
+     * @param lockKey 锁的唯一标识
+     * @param waitTime 等待获取锁的最大时间(单位:秒)
+     * @param leaseTime 锁的自动释放时间(单位:秒)
+     * @return 是否获取到锁
+     */
+    public static boolean tryLock(String lockKey, int waitTime, int leaseTime) {
+        RLock lock = instance.redissonClient.getLock(lockKey);
+        try {
+            // 尝试在 waitTime 秒内获取锁,若获取成功则保持 leaseTime 秒后自动释放
+            boolean isLocked = lock.tryLock(waitTime, leaseTime, TimeUnit.SECONDS);
+            if (isLocked) {
+                log.info("尝试获取锁成功,lockKey: {}", lockKey);
+            } else {
+                log.warn("尝试获取锁失败,lockKey: {}", lockKey);
+            }
+            return isLocked;
+        } catch (InterruptedException e) {
+            log.error("尝试获取锁被中断,lockKey: {}, 异常: {}", lockKey, e.getMessage());
+            Thread.currentThread().interrupt();
+            return false;
+        } catch (Exception e) {
+            log.error("尝试获取锁异常,lockKey: {}, 异常: {}", lockKey, e.getMessage());
+            return false;
+        }
+    }
+
+    /**
+     * 释放分布式锁
+     * @param lockKey 锁的唯一标识
+     */
+    public static void unlock(String lockKey) {
+        RLock lock = instance.redissonClient.getLock(lockKey);
+        try {
+            if (lock.isLocked() && lock.isHeldByCurrentThread()) {
+                lock.unlock();
+                log.info("释放锁成功,lockKey: {}", lockKey);
+            } else {
+                log.warn("释放锁失败,锁未被当前线程持有或已释放,lockKey: {}", lockKey);
+            }
+        } catch (Exception e) {
+            log.error("释放锁异常,lockKey: {}, 异常: {}", lockKey, e.getMessage());
+            throw new RuntimeException("释放分布式锁失败", e);
+        }
+    }
+
+    /**
+     * 释放分布式锁(带锁对象,用于 tryLock 场景)
+     * @param lock 锁对象
+     */
+    public static void unlock(RLock lock) {
+        try {
+            if (lock != null && lock.isLocked() && lock.isHeldByCurrentThread()) {
+                lock.unlock();
+                log.info("释放锁成功,lockKey: {}", lock.getName());
+            } else {
+                log.warn("释放锁失败,锁未被当前线程持有或已释放,lockKey: {}", lock.getName());
+            }
+        } catch (Exception e) {
+            log.error("释放锁异常,lockKey: {}, 异常: {}", lock.getName(), e.getMessage());
+            throw new RuntimeException("释放分布式锁失败", e);
+        }
+    }
+
+    // 关闭 Redisson 客户端(项目关闭时调用)
+    public static void shutdown() {
+        if (instance.redissonClient != null) {
+            instance.redissonClient.shutdown();
+            log.info("Redisson 客户端已关闭");
+        }
+    }
+
+}