From 4be5906991521325cd9dd509c5f693be25ebeb2e Mon Sep 17 00:00:00 2001 From: zren25 Date: Tue, 29 Apr 2025 16:41:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4redisson?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/config/RedissonConfig.java | 40 ----------------- .../center/mq/AnalysisDifyMqConsumer.java | 31 ++++++------- .../center/utils/RedisLockService.java | 43 +++++++++++++++++++ 3 files changed, 56 insertions(+), 58 deletions(-) delete mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/RedissonConfig.java create mode 100644 ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/RedisLockService.java diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/RedissonConfig.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/RedissonConfig.java deleted file mode 100644 index c638d6d..0000000 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/config/RedissonConfig.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.volvo.ai.analytic.center.config; - -import org.redisson.Redisson; -import org.redisson.api.RedissonClient; -import org.redisson.config.Config; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.cloud.context.config.annotation.RefreshScope; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -@RefreshScope -public class RedissonConfig { - - @Value("${spring.redis.host}") - private String host; - - @Value("${spring.redis.port}") - private String port; - - @Value("${spring.redis.password}") - private String password; - - @Value("${spring.redis.username}") - private String userName; - - @Bean(destroyMethod = "shutdown") - public RedissonClient redissonClient() { - Config config = new Config(); - config.useSingleServer() - .setAddress("redis://" + host + ":" + port) - .setPassword(password).setUsername(userName) - .setDatabase(0) - .setConnectionMinimumIdleSize(5) - .setIdleConnectionTimeout(10000) - .setConnectTimeout(50000) - .setTimeout(50000); - return Redisson.create(config); - } -} \ No newline at end of file diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java index 942a32b..6a14976 100644 --- a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/mq/AnalysisDifyMqConsumer.java @@ -9,13 +9,12 @@ import com.volvo.ai.analytic.center.service.AiAnalysisRequestLogsService; import com.volvo.ai.analytic.center.service.DiFyService; import com.volvo.ai.analytic.center.utils.ConstantStr; import com.volvo.ai.analytic.center.utils.RedisCounterRateLimiter; +import com.volvo.ai.analytic.center.utils.RedisLockService; import com.volvo.ai.analytic.center.utils.RedisZSetUtil; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.common.message.MessageExt; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; import org.apache.rocketmq.spring.core.RocketMQListener; -import org.redisson.api.RLock; -import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; @@ -25,7 +24,6 @@ import org.springframework.web.bind.annotation.RestController; import java.time.Instant; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.TimeUnit; /** * @ClassName AnalysisDifyMqConsumer @@ -71,16 +69,18 @@ public class AnalysisDifyMqConsumer implements RocketMQListener { @Autowired private RedisZSetUtil redisZSetUtil; + @Autowired - private RedissonClient redissonClient; + private RedisLockService redisLockService; @Override public void onMessage(MessageExt messageExt) { log.info("analysisDifyMqConsumer 当前线程: {}, 线程ID: {}", Thread.currentThread().getName(), Thread.currentThread().getId()); long startTime = System.currentTimeMillis(); - RLock lock = redissonClient.getLock("LOCK_PREFIX:" + ConstantStr.DIFY_COUNTERRATELIMIT); + String lockKey = "LOCK_PREFIX:" + ConstantStr.DIFY_COUNTERRATELIMIT; +// RLock lock = redissonClient.getLock("LOCK_PREFIX:" + ConstantStr.DIFY_COUNTERRATELIMIT); try { - // 2. 尝试加锁(参数说明:等待时间, 锁自动释放时间, 时间单位) - boolean isLocked = lock.tryLock(10, expire, TimeUnit.SECONDS); // 不等待,立即尝试获取 + + boolean isLocked = redisLockService.tryLock(lockKey,ConstantStr.DIFY_COUNTERRATELIMIT, expire); // 不等待,立即尝试获取 if (isLocked) { Long count = redisZSetUtil.zCard(ConstantStr.DIFY_COUNTERRATELIMIT); log.info("redis计数数量: {}", count); @@ -113,26 +113,21 @@ public class AnalysisDifyMqConsumer implements RocketMQListener { log.error("异步处理asyncExecuteDifyFlow 失败aiAnalysisRequestId: {} ,{}", aiAnalysisRequestId,ex.getMessage()); return null; }); - lock.unlock(); + redisLockService.releaseLock(lockKey, ConstantStr.DIFY_COUNTERRATELIMIT); log.info("analysisDifyMqConsumer处理完成,耗时:{}", System.currentTimeMillis() - startTime); }else{ log.info("redis锁未获取到 "); throw new RuntimeException("锁超时 " ); } - } catch (InterruptedException e) { -// Thread.currentThread().interrupt(); // 保持中断状态 - throw new RuntimeException("锁获取被中断", e); - } catch (Exception e){ + } catch (Exception e){ log.error("analysisDifyMqConsumer 异常:{}", e.getMessage()); throw new RuntimeException("请求dify超过基数 " ); }finally { - // 4. 确保只有持有锁的线程才能解锁(关键!) - if (lock != null && lock.isHeldByCurrentThread()) { - lock.unlock(); - // 建议记录解锁日志 - log.info("释放锁成功,锁KEY: {}", ConstantStr.DIFY_COUNTERRATELIMIT); - } + redisLockService.releaseLock(lockKey, ConstantStr.DIFY_COUNTERRATELIMIT); + // 建议记录解锁日志 + log.info("释放锁成功,锁KEY: {}", ConstantStr.DIFY_COUNTERRATELIMIT); + } } diff --git a/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/RedisLockService.java b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/RedisLockService.java new file mode 100644 index 0000000..58b91ca --- /dev/null +++ b/ai-analytic-center-biz/src/main/java/com/volvo/ai/analytic/center/utils/RedisLockService.java @@ -0,0 +1,43 @@ +package com.volvo.ai.analytic.center.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Service; + +import java.util.concurrent.TimeUnit; + +@Service +public class RedisLockService { + + @Autowired + private StringRedisTemplate stringRedisTemplate; + + /** + * 尝试获取分布式锁 + * + * @param lockKey 锁的键名 + * @param requestId 请求标识(用于解锁时验证) + * @param expireTime 锁的过期时间(秒) + * @return 是否获取锁成功 + */ + public boolean tryLock(String lockKey, String requestId, long expireTime) { + return stringRedisTemplate.opsForValue() + .setIfAbsent(lockKey, requestId, expireTime, TimeUnit.SECONDS); + } + + /** + * 释放分布式锁 + * + * @param lockKey 锁的键名 + * @param requestId 请求标识(用于验证) + * @return 是否释放锁成功 + */ + public boolean releaseLock(String lockKey, String requestId) { + String currentValue = stringRedisTemplate.opsForValue().get(lockKey); + if (currentValue != null && currentValue.equals(requestId)) { + stringRedisTemplate.delete(lockKey); + return true; + } + return false; + } +}