From 24ed24c0771cb3faf023da9e21738344f34e5c17 Mon Sep 17 00:00:00 2001 From: icanci Date: Sun, 15 Jan 2023 21:14:50 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=88=86=E5=B8=83=E5=BC=8F=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../biz/service/impl/LockServiceImpl.java | 23 ++++++++++++++++--- .../ddk/admin/dal/mapper/entity/LockDO.java | 15 ++++++++++-- .../admin/dal/mapper/mapper/LockMapper.java | 2 ++ .../resources/mybatis/mapper/LockMapper.xml | 10 +++++++- 4 files changed, 44 insertions(+), 6 deletions(-) diff --git a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/LockServiceImpl.java b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/LockServiceImpl.java index 13c5c27..2765f10 100644 --- a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/LockServiceImpl.java +++ b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/LockServiceImpl.java @@ -6,6 +6,8 @@ import cn.icanci.loopstack.ddk.admin.dal.mapper.entity.LockDO; import cn.icanci.loopstack.ddk.admin.dal.mapper.mapper.LockMapper; import io.netty.util.internal.ThrowableUtil; +import java.util.Date; + import javax.annotation.Resource; import org.slf4j.LoggerFactory; @@ -19,22 +21,37 @@ import org.springframework.stereotype.Service; @Service public class LockServiceImpl implements LockService { - private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(LockServiceImpl.class); + private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(LockServiceImpl.class); @Resource private LockMapper lockMapper; + private static final int TIMEOUT = 3000; + @Override public Long acquire(String key) { + // 查询 + String env = EnvUtils.getEnv(); + LockDO oldLock = lockMapper.queryByResource(key, env); + if (oldLock != null) { + if (System.currentTimeMillis() - oldLock.getCreateTime().getTime() > TIMEOUT) { + release(key, oldLock.getId()); + } + return null; + } + try { LockDO lockDO = new LockDO(); lockDO.setResource(key); lockDO.setDesc(key); - lockDO.setEnv(EnvUtils.getEnv()); + lockDO.setEnv(env); + lockDO.setCreateTime(new Date()); lockMapper.insert(lockDO); return lockDO.getId(); } catch (DuplicateKeyException ex) { - LOGGER.warn("[LockService][acquire] lock acquire error:{}", ThrowableUtil.stackTraceToString(ex)); + LOGGER.warn("[LockService][acquire][DuplicateKeyException] lock acquire error:{}", ThrowableUtil.stackTraceToString(ex)); + } catch (Exception ex) { + LOGGER.warn("[LockService][acquire][Exception] lock acquire error:{}", ThrowableUtil.stackTraceToString(ex)); } return null; } diff --git a/admin/admin-dal/src/main/java/cn/icanci/loopstack/ddk/admin/dal/mapper/entity/LockDO.java b/admin/admin-dal/src/main/java/cn/icanci/loopstack/ddk/admin/dal/mapper/entity/LockDO.java index 1c35034..6e981d4 100644 --- a/admin/admin-dal/src/main/java/cn/icanci/loopstack/ddk/admin/dal/mapper/entity/LockDO.java +++ b/admin/admin-dal/src/main/java/cn/icanci/loopstack/ddk/admin/dal/mapper/entity/LockDO.java @@ -2,8 +2,6 @@ package cn.icanci.loopstack.ddk.admin.dal.mapper.entity; import java.io.Serializable; import java.util.Date; -import java.util.List; -import java.math.BigDecimal; /** * DdkLock @@ -31,6 +29,11 @@ public class LockDO implements Serializable { */ private String desc; + /** + * createTime 创建时间 + */ + private Date createTime; + /** * env 环境 */ @@ -67,4 +70,12 @@ public class LockDO implements Serializable { public String getEnv() { return this.env; } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } } \ No newline at end of file diff --git a/admin/admin-dal/src/main/java/cn/icanci/loopstack/ddk/admin/dal/mapper/mapper/LockMapper.java b/admin/admin-dal/src/main/java/cn/icanci/loopstack/ddk/admin/dal/mapper/mapper/LockMapper.java index 61be5eb..b2ce0c8 100644 --- a/admin/admin-dal/src/main/java/cn/icanci/loopstack/ddk/admin/dal/mapper/mapper/LockMapper.java +++ b/admin/admin-dal/src/main/java/cn/icanci/loopstack/ddk/admin/dal/mapper/mapper/LockMapper.java @@ -29,4 +29,6 @@ public interface LockMapper { * @param resource 资源 **/ int delete(@Param("key") Object key, @Param("resource") String resource, @Param("env") String env); + + LockDO queryByResource(@Param("resource") String resource, @Param("env") String env); } diff --git a/admin/admin-dal/src/main/resources/mybatis/mapper/LockMapper.xml b/admin/admin-dal/src/main/resources/mybatis/mapper/LockMapper.xml index e0d170d..f0a8fc3 100644 --- a/admin/admin-dal/src/main/resources/mybatis/mapper/LockMapper.xml +++ b/admin/admin-dal/src/main/resources/mybatis/mapper/LockMapper.xml @@ -9,6 +9,7 @@ + @@ -16,7 +17,8 @@ , `resource`, `desc`, - `env` + `env`, + `create_time` @@ -60,5 +62,11 @@ and `env` = #{env} and `resource` = #{resource} + \ No newline at end of file -- Gitee From f9142428f8958da78f38fbf0bd7e11e8137ca6bd Mon Sep 17 00:00:00 2001 From: icanci Date: Sun, 15 Jan 2023 21:15:54 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=88=86=E5=B8=83=E5=BC=8F=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 61 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 6f04c60..b9a1b62 100644 --- a/README.md +++ b/README.md @@ -432,35 +432,56 @@ FOREIGN_KEY_CHECKS = 1; | resource | varchar(40) | 雪花算法随机UUID | | desc | varchar(200) | 功能描述 | | env | varchar(200) | 环境 | +| create_time | datetime | 资源锁定时间 | - 加锁的实现如下,比较简单的实现,一般分布式锁实现都是使用Redis等 ```java -@Service public class LockServiceImpl implements LockService { - - private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(LockServiceImpl.class); - - @Resource private LockMapper lockMapper; - - @Override public Long acquire(String key) { - try { - LockDO lockDO = new LockDO(); - lockDO.setResource(key); - lockDO.setDesc(key); - lockDO.setEnv(EnvUtils.getEnv()); - lockMapper.insert(lockDO); - return lockDO.getId(); - } catch (DuplicateKeyException ex) { - LOGGER.warn("[LockService][acquire] lock acquire error:{}", ThrowableUtil.stackTraceToString(ex)); - } - return null; +@Service +public class LockServiceImpl implements LockService { + + private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(LockServiceImpl.class); + + @Resource + private LockMapper lockMapper; + + private static final int TIMEOUT = 3000; + + @Override + public Long acquire(String key) { + // 查询 + String env = EnvUtils.getEnv(); + LockDO oldLock = lockMapper.queryByResource(key, env); + if (oldLock != null) { + if (System.currentTimeMillis() - oldLock.getCreateTime().getTime() > TIMEOUT) { + release(key, oldLock.getId()); + } + return null; } - @Override public boolean release(String key, Long lockId) { - return lockMapper.delete(lockId, key, EnvUtils.getEnv()) > 0; + try { + LockDO lockDO = new LockDO(); + lockDO.setResource(key); + lockDO.setDesc(key); + lockDO.setEnv(env); + lockDO.setCreateTime(new Date()); + lockMapper.insert(lockDO); + return lockDO.getId(); + } catch (DuplicateKeyException ex) { + LOGGER.warn("[LockService][acquire][DuplicateKeyException] lock acquire error:{}", ThrowableUtil.stackTraceToString(ex)); + } catch (Exception ex) { + LOGGER.warn("[LockService][acquire][Exception] lock acquire error:{}", ThrowableUtil.stackTraceToString(ex)); } + return null; + } + + @Override + public boolean release(String key, Long lockId) { + return lockMapper.delete(lockId, key, EnvUtils.getEnv()) > 0; + } } + ``` ## 项目界面 -- Gitee