7 changed files with 188 additions and 20 deletions
			
			
		@ -0,0 +1,79 @@ | 
				
			|||||
 | 
					package com.epmet.commons.tools.distributedlock; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					import com.epmet.commons.tools.exception.RenException; | 
				
			||||
 | 
					import com.epmet.commons.tools.redis.RedisKeys; | 
				
			||||
 | 
					import org.apache.commons.lang3.StringUtils; | 
				
			||||
 | 
					import org.redisson.api.RLock; | 
				
			||||
 | 
					import org.redisson.api.RedissonClient; | 
				
			||||
 | 
					import org.springframework.beans.factory.annotation.Autowired; | 
				
			||||
 | 
					import org.springframework.stereotype.Component; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					import java.util.concurrent.TimeUnit; | 
				
			||||
 | 
					import java.util.concurrent.atomic.AtomicInteger; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					/** | 
				
			||||
 | 
					 * @Author zxc | 
				
			||||
 | 
					 * @DateTime 2020/10/28 9:05 上午 | 
				
			||||
 | 
					 */ | 
				
			||||
 | 
					@Component | 
				
			||||
 | 
					public class DistributedLock { | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @Autowired | 
				
			||||
 | 
					    private RedissonClient redissonClient; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    /** | 
				
			||||
 | 
					     * @Description  抢锁🔒 每个锁持有十分钟 | 
				
			||||
 | 
					     * @Param name | 
				
			||||
 | 
					     * @author zxc | 
				
			||||
 | 
					     * @date 2020/10/28 2:52 下午 | 
				
			||||
 | 
					     */ | 
				
			||||
 | 
					    public RLock getLock(String name){ | 
				
			||||
 | 
					        RLock lock = null; | 
				
			||||
 | 
					        if (StringUtils.isNotBlank(name)) { | 
				
			||||
 | 
					            lock = redissonClient.getLock(name); | 
				
			||||
 | 
					            // 持续时间为 -1 时,直到其明确释放锁才会释放【宕机就完蛋了】,
 | 
				
			||||
 | 
					            lock.lock(10,TimeUnit.MINUTES); | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					        return lock; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    /** | 
				
			||||
 | 
					     * @Description | 
				
			||||
 | 
					     * @Param name 锁名 | 
				
			||||
 | 
					     * @Param leaseTime 持锁时间 单位:min | 
				
			||||
 | 
					     * @Param waitTime 获取锁最长等待时间 单位:min | 
				
			||||
 | 
					     * @author zxc | 
				
			||||
 | 
					     * @date 2020/10/29 9:04 上午 | 
				
			||||
 | 
					     */ | 
				
			||||
 | 
					    public RLock getLock(String name,Long leaseTime,Long waitTime){ | 
				
			||||
 | 
					        RLock lock = null; | 
				
			||||
 | 
					        if (StringUtils.isNotBlank(name) && leaseTime > 0 && waitTime > 0 ){ | 
				
			||||
 | 
					            lock = redissonClient.getLock(name); | 
				
			||||
 | 
					            Boolean lockStatus; | 
				
			||||
 | 
					            try { | 
				
			||||
 | 
					                lockStatus = lock.tryLock(waitTime,leaseTime,TimeUnit.MINUTES); | 
				
			||||
 | 
					                if (!lockStatus){ | 
				
			||||
 | 
					                    throw new RenException("获取锁🔒失败了......"); | 
				
			||||
 | 
					                } | 
				
			||||
 | 
					            } catch (InterruptedException e) { | 
				
			||||
 | 
					                e.printStackTrace(); | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					        return lock; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    /** | 
				
			||||
 | 
					     * @Description  释放锁🔒 | 
				
			||||
 | 
					     * @Param rLock | 
				
			||||
 | 
					     * @author zxc | 
				
			||||
 | 
					     * @date 2020/10/28 2:52 下午 | 
				
			||||
 | 
					     */ | 
				
			||||
 | 
					    public void unLock(RLock rLock){ | 
				
			||||
 | 
					        if (null != rLock){ | 
				
			||||
 | 
					            if (rLock.isHeldByCurrentThread()){ | 
				
			||||
 | 
					                rLock.unlock(); | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					} | 
				
			||||
@ -0,0 +1,12 @@ | 
				
			|||||
 | 
					package com.epmet.commons.tools.distributedlock; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					/** | 
				
			||||
 | 
					 * @Author zxc | 
				
			||||
 | 
					 * @DateTime 2020/10/28 9:23 上午 | 
				
			||||
 | 
					 */ | 
				
			||||
 | 
					public interface LockConstants { | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    String TEST_LOCK_NAME = "testLock"; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    String STATS_LOCK_NAME = "stats"; | 
				
			||||
 | 
					} | 
				
			||||
@ -0,0 +1,21 @@ | 
				
			|||||
 | 
					package com.epmet.stats.test.zxc; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					import lombok.Data; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					/** | 
				
			||||
 | 
					 * @Author zxc | 
				
			||||
 | 
					 * @DateTime 2020/10/28 3:15 下午 | 
				
			||||
 | 
					 */ | 
				
			||||
 | 
					@Data | 
				
			||||
 | 
					public class ZxcDTO { | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    private String a; | 
				
			||||
 | 
					    private String b; | 
				
			||||
 | 
					    private String c; | 
				
			||||
 | 
					    private String d; | 
				
			||||
 | 
					    private String e; | 
				
			||||
 | 
					    private Integer f; | 
				
			||||
 | 
					    private Integer g; | 
				
			||||
 | 
					    private Integer h; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					} | 
				
			||||
					Loading…
					
					
				
		Reference in new issue