package cn.cetc54.platform.core.common.lock;
|
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.integration.redis.util.RedisLockRegistry;
|
import org.springframework.stereotype.Component;
|
|
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.locks.Lock;
|
|
|
/**
|
* @author Exrick
|
*/
|
@Slf4j
|
@Component
|
public class RedisLockTemplate implements DistributedLockTemplate {
|
|
@Autowired
|
private RedisLockRegistry redisLockRegistry;
|
|
@Override
|
public Object execute(String lockId, Integer timeout, TimeUnit unit, Callback callback) {
|
|
Lock lock = null;
|
boolean getLock = false;
|
try {
|
lock = redisLockRegistry.obtain(lockId);
|
getLock = lock.tryLock(timeout, unit);
|
if(getLock){
|
// 拿到锁
|
return callback.onGetLock();
|
}else{
|
// 未拿到锁
|
return callback.onTimeout();
|
}
|
}catch(InterruptedException ex){
|
log.error(ex.getMessage(), ex);
|
Thread.currentThread().interrupt();
|
}catch (Exception e) {
|
log.error(e.getMessage(), e);
|
}finally {
|
if(getLock) {
|
// 释放锁
|
lock.unlock();
|
}
|
}
|
return null;
|
}
|
}
|