From 00cb6f1fdf7bb6f4e5c10048601b54a0a46c11bd Mon Sep 17 00:00:00 2001 From: byteblogs168 <598092184@qq.com> Date: Mon, 22 Jan 2024 17:59:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=202.6.0=201.=20=E5=88=86=E5=B8=83?= =?UTF-8?q?=E5=BC=8F=E9=94=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/lock/AbstractLockProvider.java | 37 +++++++------------ .../common/lock/DisposableLockProvider.java | 5 +++ .../retry/server/common/lock/LockBuilder.java | 1 - .../common/lock/ResidentLockProvider.java | 18 ++++++++- .../handler/DistributedLockHandler.java | 3 +- 5 files changed, 38 insertions(+), 26 deletions(-) diff --git a/easy-retry-server/easy-retry-server-common/src/main/java/com/aizuda/easy/retry/server/common/lock/AbstractLockProvider.java b/easy-retry-server/easy-retry-server-common/src/main/java/com/aizuda/easy/retry/server/common/lock/AbstractLockProvider.java index 124e042c..e02e4fcf 100644 --- a/easy-retry-server/easy-retry-server-common/src/main/java/com/aizuda/easy/retry/server/common/lock/AbstractLockProvider.java +++ b/easy-retry-server/easy-retry-server-common/src/main/java/com/aizuda/easy/retry/server/common/lock/AbstractLockProvider.java @@ -1,13 +1,12 @@ package com.aizuda.easy.retry.server.common.lock; import cn.hutool.core.lang.Assert; -import com.aizuda.easy.retry.common.core.context.SpringContext; import com.aizuda.easy.retry.server.common.cache.CacheLockRecord; import com.aizuda.easy.retry.server.common.dto.LockConfig; import com.aizuda.easy.retry.server.common.exception.EasyRetryServerException; -import org.springframework.transaction.support.TransactionTemplate; import java.time.Duration; +import java.time.LocalDateTime; /** * @author www.byteblogs.com @@ -26,40 +25,32 @@ public abstract class AbstractLockProvider implements LockProvider { LockConfig lockConfig = LockManager.getLockConfig(); String lockName = lockConfig.getLockName(); - Assert.notNull(lockAtMost, () -> new EasyRetryServerException("lockAtMost can not be null. lockName:[{}]", lockName)); - Assert.isFalse(lockAtMost.isNegative(), () -> new EasyRetryServerException("lockAtMost is negative. lockName:[{}]", lockName)); - Assert.notNull(lockAtLeast, () -> new EasyRetryServerException("lockAtLeast can not be null. lockName:[{}]", lockName)); - Assert.isFalse(lockAtLeast.compareTo(lockAtMost) > 0, () -> new EasyRetryServerException("lockAtLeast is longer than lockAtMost for lock. lockName:[{}]", lockName)); + Assert.notNull(lockAtMost, + () -> new EasyRetryServerException("lockAtMost can not be null. lockName:[{}]", lockName)); + Assert.isFalse(lockAtMost.isNegative(), + () -> new EasyRetryServerException("lockAtMost is negative. lockName:[{}]", lockName)); + Assert.notNull(lockAtLeast, + () -> new EasyRetryServerException("lockAtLeast can not be null. lockName:[{}]", lockName)); + Assert.isFalse(lockAtLeast.compareTo(lockAtMost) > 0, + () -> new EasyRetryServerException("lockAtLeast is longer than lockAtMost for lock. lockName:[{}]", + lockName)); + LockManager.setCreateDt(LocalDateTime.now()); LockManager.setLockAtLeast(lockAtLeast); LockManager.setLockAtMost(lockAtMost); + boolean tryToCreateLockRecord = !CacheLockRecord.lockRecordRecentlyCreated(lockName); if (tryToCreateLockRecord) { if (doLock(lockConfig)) { CacheLockRecord.addLockRecord(lockName); return true; } - - CacheLockRecord.addLockRecord(lockName); } - boolean lock; - try { - lock = doLockAfter(lockConfig); - } catch (Exception e) { - if (tryToCreateLockRecord) { - CacheLockRecord.remove(lockName); - } - - throw e; - } - - return lock; + return doLockAfter(lockConfig); } - protected boolean doLockAfter(LockConfig lockConfig) { - return renewal(lockConfig); - } + protected abstract boolean doLockAfter(LockConfig lockConfig); protected boolean doLock(final LockConfig lockConfig) { return createLock(lockConfig); diff --git a/easy-retry-server/easy-retry-server-common/src/main/java/com/aizuda/easy/retry/server/common/lock/DisposableLockProvider.java b/easy-retry-server/easy-retry-server-common/src/main/java/com/aizuda/easy/retry/server/common/lock/DisposableLockProvider.java index dd7f50a4..c7eba60e 100644 --- a/easy-retry-server/easy-retry-server-common/src/main/java/com/aizuda/easy/retry/server/common/lock/DisposableLockProvider.java +++ b/easy-retry-server/easy-retry-server-common/src/main/java/com/aizuda/easy/retry/server/common/lock/DisposableLockProvider.java @@ -11,6 +11,11 @@ import com.aizuda.easy.retry.server.common.lock.persistence.LockStorageFactory; */ public class DisposableLockProvider extends AbstractLockProvider { + @Override + protected boolean doLockAfter(final LockConfig lockConfig) { + return Boolean.FALSE; + } + @Override protected void doUnlock(LockConfig lockConfig) { doUnlockWithDelete(lockConfig); diff --git a/easy-retry-server/easy-retry-server-common/src/main/java/com/aizuda/easy/retry/server/common/lock/LockBuilder.java b/easy-retry-server/easy-retry-server-common/src/main/java/com/aizuda/easy/retry/server/common/lock/LockBuilder.java index c5ce3712..ac6beeef 100644 --- a/easy-retry-server/easy-retry-server-common/src/main/java/com/aizuda/easy/retry/server/common/lock/LockBuilder.java +++ b/easy-retry-server/easy-retry-server-common/src/main/java/com/aizuda/easy/retry/server/common/lock/LockBuilder.java @@ -37,7 +37,6 @@ public final class LockBuilder { Assert.notBlank(lockName, () -> new EasyRetryServerException("lockName can not be null.")); LockManager.initialize(); - LockManager.setCreateDt(LocalDateTime.now()); LockManager.setLockName(lockName); if (resident) { return new ResidentLockProvider(); diff --git a/easy-retry-server/easy-retry-server-common/src/main/java/com/aizuda/easy/retry/server/common/lock/ResidentLockProvider.java b/easy-retry-server/easy-retry-server-common/src/main/java/com/aizuda/easy/retry/server/common/lock/ResidentLockProvider.java index 84bd7bf7..6ac098ee 100644 --- a/easy-retry-server/easy-retry-server-common/src/main/java/com/aizuda/easy/retry/server/common/lock/ResidentLockProvider.java +++ b/easy-retry-server/easy-retry-server-common/src/main/java/com/aizuda/easy/retry/server/common/lock/ResidentLockProvider.java @@ -1,5 +1,6 @@ package com.aizuda.easy.retry.server.common.lock; +import com.aizuda.easy.retry.server.common.cache.CacheLockRecord; import com.aizuda.easy.retry.server.common.dto.LockConfig; import com.aizuda.easy.retry.server.common.lock.persistence.LockStorage; import com.aizuda.easy.retry.server.common.lock.persistence.LockStorageFactory; @@ -11,6 +12,22 @@ import com.aizuda.easy.retry.server.common.lock.persistence.LockStorageFactory; */ public class ResidentLockProvider extends AbstractLockProvider { + @Override + protected boolean doLockAfter(final LockConfig lockConfig) { + String lockName = lockConfig.getLockName(); + boolean lock; + try { + lock = renewal(lockConfig); + if (lock) { + CacheLockRecord.addLockRecord(lockName); + } + } catch (Exception e) { + CacheLockRecord.remove(lockName); + throw e; + } + + return lock; + } @Override protected void doUnlock(LockConfig lockConfig) { @@ -22,7 +39,6 @@ public class ResidentLockProvider extends AbstractLockProvider { lockStorage.releaseLockWithUpdate(lockConfig.getLockName(), lockConfig.getLockAtLeast()); } - @Override protected boolean createLock(LockConfig lockConfig) { LockStorage lockStorage = LockStorageFactory.getLockStorage(); diff --git a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/handler/DistributedLockHandler.java b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/handler/DistributedLockHandler.java index 569da9e1..4a99428b 100644 --- a/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/handler/DistributedLockHandler.java +++ b/easy-retry-server/easy-retry-server-job-task/src/main/java/com/aizuda/easy/retry/server/job/task/support/handler/DistributedLockHandler.java @@ -88,8 +88,8 @@ public class DistributedLockHandler { EasyRetryLog.LOCAL.error("lock execute error. lockName:[{}]", lockName, throwable); } finally { if (lock) { - EasyRetryLog.LOCAL.info("[{}] 锁已释放", lockName); lockProvider.unlock(); + EasyRetryLog.LOCAL.info("[{}] 锁已释放", lockName); } else { // 未获取到锁直接清除线程中存储的锁信息 LockManager.clear(); @@ -122,6 +122,7 @@ public class DistributedLockHandler { EasyRetryLog.LOCAL.error("lock execute error. lockName:[{}]", lockName, e); } finally { if (lock) { + EasyRetryLog.LOCAL.info("[{}] 锁已释放", lockName); lockProvider.unlock(); } else { // 未获取到锁直接清除线程中存储的锁信息