From 3479ad5223c328be72a2b26ab66f9aeee64ec4b5 Mon Sep 17 00:00:00 2001
From: zhangback <zhangback@163.com>
Date: 星期二, 18 十一月 2025 17:40:30 +0800
Subject: [PATCH] 提交
---
system/src/main/java/com/ruoyi/system/service/impl/SystemDataNoServiceImpl.java | 42 ++++++++++++++++++++++++++++++------------
1 files changed, 30 insertions(+), 12 deletions(-)
diff --git a/system/src/main/java/com/ruoyi/system/service/impl/SystemDataNoServiceImpl.java b/system/src/main/java/com/ruoyi/system/service/impl/SystemDataNoServiceImpl.java
index 7d57010..3020770 100644
--- a/system/src/main/java/com/ruoyi/system/service/impl/SystemDataNoServiceImpl.java
+++ b/system/src/main/java/com/ruoyi/system/service/impl/SystemDataNoServiceImpl.java
@@ -4,6 +4,7 @@
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.core.redis.RedisLock;
import com.ruoyi.common.enums.SystemDataNoEnum;
+import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysSerialNumber;
@@ -15,7 +16,9 @@
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import java.util.concurrent.TimeUnit;
@Slf4j
@@ -28,12 +31,15 @@
@Autowired
private RedisCache redisCache;
- /**娴佹按鍙峰惎鐢ㄧ紦瀛�*/
@Value("${custom.serialNumber.cache.enabled:false}")
private boolean serialNumberCache;
@Autowired
private ISysSerialNumberService serialNumberService;
+
+ private static final long LOCK_WAIT_TIME = 5; // 灏濊瘯鑾峰彇閿佹渶澶х瓑寰呮椂闂达紙绉掞級
+ private static final long LOCK_LEASE_TIME = 10; // 閿佺殑鑷姩閲婃斁鏃堕棿锛堢锛�
+
@Override
@@ -43,27 +49,43 @@
return "";
}
- String dayKey = DateUtils.dateYYMM();
+ String dayKey = DateUtils.dateTime();
String fullKey = baseNo + dayKey;
- RLock lock = redisLock.lock(Constants.SYS_DATASERIALNUMBER_KEYPREFIX + fullKey);
+ RLock lock = redisLock.getRLock(Constants.SYS_DATASERIALNUMBER_KEYPREFIX + fullKey);
+ boolean locked = false;
try {
- if (!lock.tryLock(60, TimeUnit.SECONDS)) {
- throw new RuntimeException("鑾峰彇閿佸け璐�");
+ locked = lock.tryLock(LOCK_WAIT_TIME, LOCK_LEASE_TIME, TimeUnit.SECONDS);
+ if (!locked) {
+ throw new RuntimeException("鑾峰彇閿佸け璐ワ紝璇风◢鍚庨噸璇�");
}
log.info("{}杩涘叆", Thread.currentThread().getName());
Integer serial = getOrInitSerialNumber(fullKey, baseNo, dayKey);
- redisCache.setCacheObject(fullKey, serial, 1000, TimeUnit.DAYS);
+ redisCache.setCacheObject(fullKey, serial, 1, TimeUnit.DAYS);
return formatSerialNumber(fullKey, serial);
} catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
throw new RuntimeException("鑾峰彇閿佸紓甯�", e);
} finally {
- unlockIfHeld(lock);
+ if (locked) {
+ unlockIfHeld(lock);
+ }
}
}
+ private void unlockIfHeld(RLock lock) {
+ try {
+ if (lock != null && lock.isLocked() && lock.isHeldByCurrentThread()) {
+ lock.unlock();
+ }
+ } catch (Exception e) {
+ log.warn("閲婃斁閿佸紓甯�: {}", e.getMessage(), e);
+ }
+ }
+
+ // 浠ヤ笅鏂规硶淇濇寔鍘熸牱
private Integer getOrInitSerialNumber(String fullKey, String baseNo, String dayKey) {
Integer serial = serialNumberCache ? redisCache.getCacheObject(fullKey) : null;
@@ -93,9 +115,5 @@
return prefix + String.format("%04d", serial);
}
- private void unlockIfHeld(RLock lock) {
- if (lock != null && lock.isLocked() && lock.isHeldByCurrentThread()) {
- lock.unlock();
- }
- }
+
}
--
Gitblit v1.8.0