提交 5940b08a authored 作者: liuhaiquan's avatar liuhaiquan

增加结算单支付锁

上级 0705f230
package com.clx.performance.service.impl.breakcontract; package com.clx.performance.service.impl.breakcontract;
import com.clx.performance.constant.RedissonConstants;
import com.clx.performance.dao.breakcontract.BreakContractSettlementDriverDao; import com.clx.performance.dao.breakcontract.BreakContractSettlementDriverDao;
import com.clx.performance.enums.BreakContractSettlementDriverEnum; import com.clx.performance.enums.BreakContractSettlementDriverEnum;
import com.clx.performance.enums.PerformanceResultEnum; import com.clx.performance.enums.PerformanceResultEnum;
import com.clx.performance.model.breakcontract.BreakContractSettlementDriver; import com.clx.performance.model.breakcontract.BreakContractSettlementDriver;
import com.clx.performance.service.breakcontract.BreakContractJobHandlerService; import com.clx.performance.service.breakcontract.BreakContractJobHandlerService;
import com.clx.performance.service.payment.PayService; import com.clx.performance.service.payment.PayService;
import com.clx.performance.utils.RedisUtil;
import com.msl.common.exception.ServiceSystemException; import com.msl.common.exception.ServiceSystemException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.Objects; import java.util.Objects;
import java.util.UUID;
@Slf4j @Slf4j
@Service @Service
...@@ -24,25 +28,42 @@ public class BreakContractJobHandlerServiceImpl implements BreakContractJobHandl ...@@ -24,25 +28,42 @@ public class BreakContractJobHandlerServiceImpl implements BreakContractJobHandl
@Autowired @Autowired
private PayService payService; private PayService payService;
@Autowired
RedisUtil redisUtil;
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Override @Override
public String pay(Integer settlementId){ public String pay(Integer settlementId){
String uuid = UUID.randomUUID().toString();
String key = RedissonConstants.BREAK_CONTRACT_SETTLEMENT_OWNER_BATCH_PAY_ID_LOCK + settlementId;
try{
boolean flag = redisUtil.lock(key, uuid,180);
if(!flag){
return "获取支付锁失败,操作频繁,请稍后重试";
}
String msg = null;
BreakContractSettlementDriver breakContractSettlementDriver = breakContractSettlementDriverDao.getEntityByKey(settlementId).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
String msg = null; if (Objects.equals(breakContractSettlementDriver.getSettleStatus(), BreakContractSettlementDriverEnum.SettleStatus.YES)){
BreakContractSettlementDriver breakContractSettlementDriver = breakContractSettlementDriverDao.getEntityByKey(settlementId).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND); return msg;
}
if (Objects.equals(breakContractSettlementDriver.getSettleStatus(), BreakContractSettlementDriverEnum.SettleStatus.YES)){ try {
pay(breakContractSettlementDriver);
}catch (ServiceSystemException e){
breakContractSettlementDriver.setPayRemark(e.getMessage());
breakContractSettlementDriverDao.updatePayFail(breakContractSettlementDriver);
msg = e.getMessage();
}
return msg; return msg;
}catch (Exception e){
log.warn("违约结算单支付上锁失败,结算单ID:{},异常原因:{}", settlementId, ExceptionUtils.getStackTrace(e));
//解锁
redisUtil.unlock(key,uuid);
throw new ServiceSystemException(PerformanceResultEnum.TRY_LOCK_ERROR);
} }
try {
pay(breakContractSettlementDriver);
}catch (ServiceSystemException e){
breakContractSettlementDriver.setPayRemark(e.getMessage());
breakContractSettlementDriverDao.updatePayFail(breakContractSettlementDriver);
msg = e.getMessage();
}
return msg;
} }
......
...@@ -41,6 +41,7 @@ import com.msl.common.enums.ResultCodeEnum; ...@@ -41,6 +41,7 @@ import com.msl.common.enums.ResultCodeEnum;
import com.msl.common.exception.ServiceSystemException; import com.msl.common.exception.ServiceSystemException;
import com.msl.common.result.Result; import com.msl.common.result.Result;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
...@@ -216,7 +217,7 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic ...@@ -216,7 +217,7 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
String uuid = UUID.randomUUID().toString(); String uuid = UUID.randomUUID().toString();
String key = RedissonConstants.SETTLEMENT_OWNER_BATCH_PAY_ID_LOCK + detail.getId(); String key = RedissonConstants.SETTLEMENT_OWNER_BATCH_PAY_ID_LOCK + detail.getId();
try{ try{
boolean flag = redisUtil.lock(key, uuid); boolean flag = redisUtil.lock(key, uuid,180);
if(!flag){ if(!flag){
return "获取支付锁失败,操作频繁,请稍后重试"; return "获取支付锁失败,操作频繁,请稍后重试";
} }
...@@ -257,9 +258,10 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic ...@@ -257,9 +258,10 @@ public class SettlementMqHandlerServiceImpl implements SettlementMqHandlerServic
} }
return msg; return msg;
}catch (Exception e){ }catch (Exception e){
log.warn("结算单支付上锁失败,结算单ID:{},异常原因:{}", detail.getId(), ExceptionUtils.getStackTrace(e));
//解锁 //解锁
redisUtil.unlock(key,uuid); redisUtil.unlock(key,uuid);
throw new ServiceSystemException(PerformanceResultEnum.DATA_REPEAT); throw new ServiceSystemException(PerformanceResultEnum.TRY_LOCK_ERROR);
} }
} }
......
...@@ -75,11 +75,14 @@ public class RedisUtil { ...@@ -75,11 +75,14 @@ public class RedisUtil {
this.redisTemplate.delete(key); this.redisTemplate.delete(key);
return true; return true;
} }
public boolean lock(String key, String lockSeqId) { public boolean lock(String key, String lockSeqId) {
return setAtomicLockKey(key, lockSeqId); return setAtomicLockKey(key, lockSeqId);
} }
public boolean lock(String key, String lockSeqId, Integer expire) {
return setAtomicLockKey(key, lockSeqId,expire);
}
public boolean lock(String key, String lockSeqId, int second) { public boolean lock(String key, String lockSeqId, int second) {
return setAtomicLockKey(key, lockSeqId, second); return setAtomicLockKey(key, lockSeqId, second);
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论