Commit 82b6d938 by gechengyang

提交lck表相关操作

parent 30c9c300
package com.brilliance.isc.common.lock.impl; package com.brilliance.isc.common.lock.impl;
import com.brilliance.isc.common.context.SpringEnvContext;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.slf4j.Logger; import org.slf4j.Logger;
import com.brilliance.isc.common.lock.BizLocker; import com.brilliance.isc.common.lock.BizLocker;
...@@ -49,13 +50,15 @@ public abstract class AbstractBizLocker implements BizLocker { ...@@ -49,13 +50,15 @@ public abstract class AbstractBizLocker implements BizLocker {
@Override @Override
public boolean lock(LockInfo lockInfo, long seconds) { public boolean lock(LockInfo lockInfo, long seconds) {
return this.lock(lockInfo.genLockKey(),lockInfo.genLockValue(),seconds); // return this.lock(lockInfo.genLockKey(),lockInfo.genLockValue(),seconds);
return SpringEnvContext.getBean(AbstractBizLocker.class).lock(lockInfo.genLockKey(),lockInfo.genLockValue(),seconds);
} }
@Override @Override
public boolean lock(LockInfo lockInfo) { public boolean lock(LockInfo lockInfo) {
return this.lock(lockInfo.genLockKey(),lockInfo.genLockValue(),DEFAULT_LEASE_TIME); // return this.lock(lockInfo.genLockKey(),lockInfo.genLockValue(),DEFAULT_LEASE_TIME);
return SpringEnvContext.getBean(AbstractBizLocker.class).lock(lockInfo.genLockKey(),lockInfo.genLockValue(),DEFAULT_LEASE_TIME);
} }
/** /**
......
package com.brilliance.isc.common.lock.impl; package com.brilliance.isc.common.lock.impl;
import com.brilliance.isc.common.util.StringUtils;
import com.brilliance.isc.bo.Lck; import com.brilliance.isc.bo.Lck;
import com.brilliance.isc.bo.Stb; import com.brilliance.isc.bo.Stb;
import com.brilliance.isc.common.lock.LockInfo;
import com.brilliance.isc.mda.dao.StbMapper; import com.brilliance.isc.mda.dao.StbMapper;
import com.brilliance.isc.vo.manager.StbVo; import com.brilliance.isc.vo.manager.StbVo;
import org.apache.commons.lang3.StringUtils; import org.redisson.api.RBucket;
import org.slf4j.Logger; import org.redisson.api.RedissonClient;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
import com.brilliance.isc.common.lock.LockInfo;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit;
@Service @Service
@Primary
public class DBLckBizLocker extends AbstractBizLocker { public class DBLckBizLocker extends AbstractBizLocker {
private final Logger logger = LoggerFactory.getLogger(DBLckBizLocker.class); private static Logger logger = LoggerFactory.getLogger(RedisBizLocker.class);
@Autowired @Autowired
private LckComponent lckComponent; private LckComponent lckComponent;
...@@ -32,62 +34,97 @@ public class DBLckBizLocker extends AbstractBizLocker { ...@@ -32,62 +34,97 @@ public class DBLckBizLocker extends AbstractBizLocker {
private final String DBLOCKER = "DBLOCK"; private final String DBLOCKER = "DBLOCK";
private boolean getSwitchFlag() { private boolean getSwitchFlag(){
StbVo stbVo = new StbVo(); StbVo stbVo = new StbVo();
stbVo.setTbl(DBLOCKER); stbVo.setTbl(DBLOCKER);
List<Stb> stbs = stbMapper.queryByPage(stbVo); List<Stb> stbs = stbMapper.queryByPage(stbVo);
if (stbs == null || stbs.size() == 0) { if(stbs == null || stbs.size() == 0){
return false; return false;
} }
return "Y".equals(stbs.get(0).getCod()) ? true : false; return "Y".equals(stbs.get(0).getCod()) ? true : false;
} }
@Resource
private RedissonClient redissonClient;
/** /**
* @param key 为业务主键,使用LockInfo的方法生成key * @param key 为业务主键,使用LockInfo的方法生成key
* @param value 为业务锁定信息,一般为交易码+操作人,使用LockInfo的方法生成value * @param value 为业务锁定信息,一般为交易码+操作人,使用LockInfo的方法生成value
* @param seconds 锁定时间,db模式下无效 * @param seconds 锁定时间,db模式下无效
* @return * @return
*/ */
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) @Transactional(propagation = Propagation.REQUIRES_NEW,rollbackFor = Exception.class)
public boolean lock(String key, String value, long seconds) { public boolean lock(String key,String value, long seconds) {
if (!getSwitchFlag()) { if(!getSwitchFlag()){
logger.info("锁定函数暂时关闭"); logger.info("锁定函数暂时关闭");
return true; return true;
} }
LockInfo lockInfo = new LockInfo(key, value); LockInfo lockInfo = new LockInfo(key,value);
//insert前增加redis分布式锁
boolean isRedisSucess = false;
RBucket<String> bucket = redissonClient.getBucket(key);
String oldbucketValue = bucket.get();
// 不存在时,新增
if (StringUtils.isEmpty(oldbucketValue)) {
isRedisSucess = bucket.trySet(value, seconds, TimeUnit.SECONDS);
logger.info("锁key:{},value:{},结果:{}",key,value,isRedisSucess);
if (isRedisSucess == false)
{
return false;
}
}
// 相同时,刷新时间
if (!StringUtils.isEmpty(oldbucketValue) && oldbucketValue.equals(value)) {
if(value.endsWith("#true")) {
isRedisSucess = bucket.setIfExists(value, seconds, TimeUnit.SECONDS);
logger.info("锁已重入并刷新时间key:{},value:{}",key,value);
}else{
logger.info("锁无法重入key:{},value:{}",key,value);
}
if (isRedisSucess == false)
{
return false;
}
}
boolean isSuccess = lckComponent.tryInsert(lockInfo); boolean isSuccess = lckComponent.tryInsert(lockInfo);
// 插入成功,新增 // 插入成功,新增
if (isSuccess) { if (isSuccess) {
logger.info("锁key:{},value:{},结果:成功", key, value); logger.info("锁key:{},value:{},结果:成功",key,value);
return true; return true;
} }
lockInfo = getLock(lockInfo); lockInfo = getLock(lockInfo);
String oldValue = lockInfo.genLockValue(); String oldValue = lockInfo.genLockValue();
// 相同时,刷新时间 // 相同时,刷新时间
if (oldValue.equals(value)) { if (oldValue.equals(value)) {
if (value.endsWith("#true")) { if(value.endsWith("#true")) {
logger.info("锁已重入key:{},value:{}", key, value); logger.info("锁已重入key:{},value:{}",key,value);
isSuccess = true; isSuccess = true;
} else { }else{
logger.info("锁无法重入key:{},value:{}", key, value); logger.info("锁无法重入key:{},value:{}",key,value);
} }
} }
return isSuccess; return isSuccess;
} }
@Override @Override
public LockInfo getLock(LockInfo lockInfo) { public LockInfo getLock(LockInfo lockInfo) {
if (!getSwitchFlag()) { if(!getSwitchFlag()){
logger.info("锁定函数暂时关闭"); logger.info("锁定函数暂时关闭");
return null; return null;
} }
String key = lockInfo.genLockKey(); String key = lockInfo.genLockKey();
LockInfo dbLockInfo = lckComponent.getLck(lockInfo); LockInfo dbLockInfo = lckComponent.getLck(lockInfo);
if (dbLockInfo != null) { if(dbLockInfo != null){
String value = dbLockInfo.genLockValue(); String value = dbLockInfo.genLockValue();
logger.info("返回锁信息key:{},value:{}", key, value); logger.info("返回锁信息key:{},value:{}",key,value);
return dbLockInfo; return dbLockInfo;
} }
return null; return null;
...@@ -96,36 +133,56 @@ public class DBLckBizLocker extends AbstractBizLocker { ...@@ -96,36 +133,56 @@ public class DBLckBizLocker extends AbstractBizLocker {
@Override @Override
public boolean unlock(LockInfo lockInfo) { public boolean unlock(LockInfo lockInfo) {
if (!getSwitchFlag()) { if(!getSwitchFlag()){
logger.info("锁定函数暂时关闭"); logger.info("锁定函数暂时关闭");
return true; return true;
} }
String key = lockInfo.genLockKey(); String key = lockInfo.genLockKey();
LockInfo oldLockInfo = getLock(lockInfo); LockInfo oldLockInfo = getLock(lockInfo);
if (oldLockInfo != null) { if(oldLockInfo != null){
logger.info("返回锁信息key:{},value:{}", key, oldLockInfo.genLockValue()); logger.info("返回锁信息key:{},value:{}",key,oldLockInfo.genLockValue());
if (oldLockInfo.getUsrId().equals(lockInfo.getUsrId())) { if(oldLockInfo.getUsrId().equals(lockInfo.getUsrId())){
logger.info("删除锁{}", key); logger.info("删除锁{}",key);
int cnt = lckComponent.deleteLck(oldLockInfo); int cnt = lckComponent.deleteLck(oldLockInfo);
logger.info("删除锁成功{},影响行数{}", key, cnt); logger.info("删除锁成功{},影响行数{}",key,cnt);
return true; return true;
} else { }else{
logger.info("{}锁定人不一致,不允许删除,oldUserId:{},curUserId{},", key, oldLockInfo.getUsrId(), lockInfo.getUsrId()); logger.info("{}锁定人不一致,不允许删除,oldUserId:{},curUserId{},",key,oldLockInfo.getUsrId(),lockInfo.getUsrId());
} }
} }
// 删除redis事务锁
RBucket<String> bucket = redissonClient.getBucket(key);
String value = bucket.get();
logger.info("返回锁信息key:{},value:{}",key,value);
if(value != null){
LockInfo oldRedisLockInfo = new LockInfo(key,value);
if(oldRedisLockInfo.getUsrId().equals(lockInfo.getUsrId())){
logger.info("删除锁{}",key);
bucket.delete();
return true;
}else{
logger.info("{}锁定人不一致,不允许删除,oldUserId:{},curUserId{},",key,oldLockInfo.getUsrId(),lockInfo.getUsrId());
}
}
return false; return false;
} }
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) @Transactional(propagation = Propagation.REQUIRES_NEW,rollbackFor = Exception.class)
public boolean lockForce(String key, String value, long seconds) { public boolean lockForce(String key,String value, long seconds) {
logger.info("强制占用锁{}:{}", key, value); logger.info("强制占用锁{}:{}",key,value);
LockInfo lockInfo = new LockInfo(key, value); LockInfo lockInfo = new LockInfo(key,value);
lckComponent.updateLockInfo(lockInfo); lckComponent.updateLockInfo(lockInfo);
logger.info("强制占用锁{}:{}成功", key, value); logger.info("强制占用锁{}:{}成功",key,value);
return true; return true;
} }
/** /**
* 强制解锁 * 强制解锁
* *
...@@ -135,9 +192,9 @@ public class DBLckBizLocker extends AbstractBizLocker { ...@@ -135,9 +192,9 @@ public class DBLckBizLocker extends AbstractBizLocker {
@Override @Override
public boolean unlockForce(LockInfo lockInfo) { public boolean unlockForce(LockInfo lockInfo) {
String key = lockInfo.genLockKey(); String key = lockInfo.genLockKey();
logger.info("强制删除锁{}", key); logger.info("强制删除锁{}",key);
int cnt = lckComponent.deleteLck(lockInfo); int cnt = lckComponent.deleteLck(lockInfo);
logger.info("强制删除锁成功{},影响行数{}", key, cnt); logger.info("强制删除锁成功{},影响行数{}",key,cnt);
return true; return true;
} }
...@@ -150,10 +207,10 @@ public class DBLckBizLocker extends AbstractBizLocker { ...@@ -150,10 +207,10 @@ public class DBLckBizLocker extends AbstractBizLocker {
@Override @Override
public boolean unlockAllOfTrans(String transName, String userId) { public boolean unlockAllOfTrans(String transName, String userId) {
Lck lck = new Lck(); Lck lck = new Lck();
lck.setLcktrn(StringUtils.upperCase(transName)); lck.setLcktrn(transName);
lck.setLckusr(userId); lck.setLckusr(userId);
int cnt = lckComponent.deleteLckByUserAndTrn(lck); int cnt = lckComponent.deleteLckByUserAndTrn(lck);
logger.info("解除{}用户在{}交易的所有锁定,影响行数{}", userId, transName, cnt); logger.info("解除{}用户在{}交易的所有锁定,影响行数{}",userId,transName,cnt);
return true; return true;
} }
...@@ -165,12 +222,12 @@ public class DBLckBizLocker extends AbstractBizLocker { ...@@ -165,12 +222,12 @@ public class DBLckBizLocker extends AbstractBizLocker {
*/ */
@Override @Override
public boolean unlockAllOfUser(String userId) { public boolean unlockAllOfUser(String userId) {
logger.info("退出锁定{}", userId); logger.info("退出锁定{}",userId);
Lck lck = new Lck(); Lck lck = new Lck();
lck.setLcktrn(null); lck.setLcktrn(null);
lck.setLckusr(userId); lck.setLckusr(userId);
int cnt = lckComponent.deleteLckByUserAndTrn(lck); int cnt = lckComponent.deleteLckByUserAndTrn(lck);
logger.info("退出锁定成功{},影响行数{}", userId, cnt); logger.info("退出锁定成功{},影响行数{}",userId,cnt);
return false; return false;
} }
} }
package com.brilliance.isc.common.lock.impl; package com.brilliance.isc.common.lock.impl;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
import com.brilliance.isc.bo.Lck; import com.brilliance.isc.bo.Lck;
import com.brilliance.isc.common.lock.LockInfo; import com.brilliance.isc.common.lock.LockInfo;
import com.brilliance.isc.mda.dao.LckMapper; import com.brilliance.isc.mda.dao.LckMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -24,39 +24,40 @@ public class LckComponent { ...@@ -24,39 +24,40 @@ public class LckComponent {
int cnt = lckMapper.insert(lck); int cnt = lckMapper.insert(lck);
logger.info("锁定信息插入成功,影响行数:{}", cnt); logger.info("锁定信息插入成功,影响行数:{}", cnt);
return true; return true;
} catch (Exception e) { }catch(Exception e){
logger.info("已存在锁{}", lockInfo.genLockKey()); logger.info("已存在锁{}",lockInfo.genLockKey());
} finally { }
finally {
} }
return false; return false;
} }
public Lck lockInfo2Lck(LockInfo lockInfo) { public Lck lockInfo2Lck(LockInfo lockInfo){
Lck dataLck = new Lck(); Lck dataLck = new Lck();
dataLck.setLckdattim(new Date()); dataLck.setLckdattim(new Date());
dataLck.setLcktrn(lockInfo.getTrnName()); dataLck.setLcktrn(lockInfo.getTrnName());
dataLck.setLckusr(lockInfo.getUsrId()); dataLck.setLckusr(lockInfo.getUsrId());
dataLck.setLckstr(lockInfo.genLockKey()); dataLck.setLckstr(lockInfo.genLockKey());
if (lockInfo.isReentrant()) { if(lockInfo.isReentrant()){
dataLck.setLckhld(""); dataLck.setLckhld("");
} else { }else{
dataLck.setLckhld("X"); dataLck.setLckhld("X");
} }
return dataLck; return dataLck;
} }
public LockInfo lck2Info(Lck dataLck) { public LockInfo lck2Info(Lck dataLck){
if (dataLck == null) { if(dataLck == null){
return null; return null;
} }
LockInfo lockInfo = new LockInfo(dataLck.getLckstr()); LockInfo lockInfo = new LockInfo(dataLck.getLckstr());
lockInfo.setTrnName(dataLck.getLcktrn()); lockInfo.setTrnName(dataLck.getLcktrn());
lockInfo.setUsrId(dataLck.getLckusr()); lockInfo.setUsrId(dataLck.getLckusr());
if (dataLck.getLckhld() == null || dataLck.getLckhld().trim().isEmpty()) { if(dataLck.getLckhld() == null || dataLck.getLckhld().trim().isEmpty()){
lockInfo.setReentrant(true); lockInfo.setReentrant(true);
} else { }else{
lockInfo.setReentrant(false); lockInfo.setReentrant(false);
} }
return lockInfo; return lockInfo;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment