diff --git a/lock4j-redis-template-spring-boot-starter/src/main/java/com/baomidou/lock/executor/RedisTemplateLockExecutor.java b/lock4j-redis-template-spring-boot-starter/src/main/java/com/baomidou/lock/executor/RedisTemplateLockExecutor.java index 25a6c5245eb4bef5e5a6face5ae082f7255087a4..6648dcadfe7fc0818c2307a6e885751bba4fcdc4 100644 --- a/lock4j-redis-template-spring-boot-starter/src/main/java/com/baomidou/lock/executor/RedisTemplateLockExecutor.java +++ b/lock4j-redis-template-spring-boot-starter/src/main/java/com/baomidou/lock/executor/RedisTemplateLockExecutor.java @@ -25,9 +25,11 @@ import org.springframework.data.redis.core.script.DefaultRedisScript; import org.springframework.data.redis.core.script.RedisScript; import java.util.Collections; +import java.util.Map; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; /** * 分布式锁原生RedisTemplate处理器 @@ -49,6 +51,9 @@ public class RedisTemplateLockExecutor extends AbstractLockExecutor { private final StringRedisTemplate redisTemplate; private final Lock4jProperties lock4jProperties; + // 记录续期任务 + private final Map renewalTaskMap = new ConcurrentHashMap<>(); + @Override public boolean renewal() { return true; @@ -88,19 +93,37 @@ public class RedisTemplateLockExecutor extends AbstractLockExecutor { redisTemplate.getStringSerializer(), redisTemplate.getStringSerializer(), Collections.singletonList(key), value); - return Boolean.parseBoolean(releaseResult); + boolean flag = Boolean.parseBoolean(releaseResult); + if (flag) { + // https://gitee.com/baomidou/lock4j/issues/IBIE4A Bug 修复 + TimerTask task = renewalTaskMap.remove(key); + if (task != null) { + task.cancel(); + log.debug("Cancelled renewal task for key: {}", key); + } + } + return flag; } private void renewExpiration(long expire, String lockKey, String lockValue) { - new Timer().schedule(new TimerTask() { + // 检查是否已存在续期任务 + if (renewalTaskMap.containsKey(lockKey)) { + log.debug("Renewal task already exists for key: {}", lockKey); + return; + } + + TimerTask task = new TimerTask() { @Override public void run() { + // 判断锁是否有效且属于当前持有者 if (Boolean.TRUE.equals(redisTemplate.execute(SCRIPT_RENEWAL, Collections.singletonList(lockKey), lockValue, String.valueOf(expire)))) { renewExpiration(expire, lockKey, lockValue); } } - }, expire / 3); + }; + new Timer().schedule(task, expire / 3); + renewalTaskMap.put(lockKey, task); }