浏览代码

锁操作finally释放

yzc 2 年之前
父节点
当前提交
58931ab937

+ 21 - 17
sckw-modules/sckw-message/src/main/java/com/sckw/message/service/SckwSmsHandlerService.java

@@ -1,8 +1,8 @@
 package com.sckw.message.service;
 
 import com.alibaba.fastjson2.JSON;
-import com.sckw.redis.constant.RedisConstant;
 import com.sckw.message.model.KwmSms;
+import com.sckw.redis.constant.RedisConstant;
 import com.sckw.redis.utils.RedissonUtils;
 import com.sckw.stream.enums.SmsCodeEnum;
 import com.sckw.stream.model.SckwSms;
@@ -34,24 +34,28 @@ public class SckwSmsHandlerService {
         log.info("接收到发送短信消息:{},开始处理", JSON.toJSONString(sckwSms));
         String type = sckwSms.getType();
         String phone = sckwSms.getPhone();
-        String requestKey = getKey(RedisConstant.MESSAGE_SMS_VERIFY_CODE_REQUEST_KEY,type,phone);
-        if (Boolean.FALSE.equals(RedissonUtils.tryLock(requestKey, 10L, RedisConstant.SMS_VERIFY_CODE_VALID_TIME))) {
-            log.info("重复发送短信消息,不处理");
+        String requestKey = getKey(RedisConstant.MESSAGE_SMS_VERIFY_CODE_REQUEST_KEY, type, phone);
+        if (Boolean.FALSE.equals(RedissonUtils.tryLock(requestKey, 10L, 30L))) {
+            log.info("获取发送短信锁失败,不处理");
             return;
         }
-        String valueKey = getKey(RedisConstant.MESSAGE_SMS_VERIFY_CODE_VALUE_KEY, type,phone);
-        //发送短信
-        SmsUtil.sendSms(sckwSms.getPhone(), sckwSms.getSignName(), sckwSms.getTemplateCode().getName(), JSON.toJSONString(sckwSms.getParams()));
-        //放入缓存
-        RedissonUtils.putString(valueKey, String.valueOf(sckwSms.getParams().get("code")), RedisConstant.SMS_VERIFY_CODE_VALID_TIME);
-        //数据入库
-        SmsCodeEnum smsCodeEnum = sckwSms.getTemplateCode();
-        KwmSms kwmSms = KwmSms.builder().type(smsCodeEnum.getType()).code(smsCodeEnum.getName())
-                .phone(sckwSms.getPhone()).content(smsCodeEnum.getValue())
-                .params(JSON.toJSONString(sckwSms.getParams())).build();
-        kwmSms.setCreateBy(sckwSms.getCreateBy());
-        kwmSms.setUpdateBy(sckwSms.getCreateBy());
-        kwmSmsService.add(kwmSms);
+        try {
+            String valueKey = getKey(RedisConstant.MESSAGE_SMS_VERIFY_CODE_VALUE_KEY, type, phone);
+            //发送短信
+            SmsUtil.sendSms(sckwSms.getPhone(), sckwSms.getSignName(), sckwSms.getTemplateCode().getName(), JSON.toJSONString(sckwSms.getParams()));
+            //放入缓存
+            RedissonUtils.putString(valueKey, String.valueOf(sckwSms.getParams().get("code")), RedisConstant.SMS_VERIFY_CODE_VALID_TIME);
+            //数据入库
+            SmsCodeEnum smsCodeEnum = sckwSms.getTemplateCode();
+            KwmSms kwmSms = KwmSms.builder().type(smsCodeEnum.getType()).code(smsCodeEnum.getName())
+                    .phone(sckwSms.getPhone()).content(smsCodeEnum.getValue())
+                    .params(JSON.toJSONString(sckwSms.getParams())).build();
+            kwmSms.setCreateBy(sckwSms.getCreateBy());
+            kwmSms.setUpdateBy(sckwSms.getCreateBy());
+            kwmSmsService.add(kwmSms);
+        } finally {
+            RedissonUtils.unlock(requestKey);
+        }
     }
 
     private String getKey(String prefix, String args1, String args2) {

+ 39 - 35
sckw-modules/sckw-order/src/main/java/com/sckw/order/dubbo/TradeOrderInfoServiceImpl.java

@@ -105,46 +105,50 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
         Long id = param.getTOrderId();
         Long updateBy = param.getUpdateBy();
         String lockKey = String.format(RedisConstant.GOODS_UPDATE_AMOUNT_KEY, id);
-        if (Boolean.FALSE.equals(RedissonUtils.tryLock(lockKey, 3L, 3L))) {
+        if (Boolean.FALSE.equals(RedissonUtils.tryLock(lockKey, 10L, 30L))) {
             return HttpResult.error("业务繁忙,请稍后再试!");
         }
-        KwoTradeOrder order = kwoTradeOrderService.getById(id);
-        if (Objects.isNull(order)) {
-            return HttpResult.error("订单不存在!");
-        }
-        if (!Objects.equals(String.valueOf(order.getStatus()), DictEnum.TORDER_STATUS_4.getValue())) {
-            return HttpResult.error("执行中的订单才可物流托运!");
-        }
-        BigDecimal amount = order.getAmount();
-        BigDecimal addEntrustAmount = order.getEntrustAmount();
-        if (Objects.nonNull(param.getEntrustAmount())) {
-            addEntrustAmount = addEntrustAmount.add(param.getActualAmount());
-            if (amount.compareTo(addEntrustAmount) < 0) {
-                return HttpResult.error("物流已委托总量不可大于订单总量!");
+        try {
+            KwoTradeOrder order = kwoTradeOrderService.getById(id);
+            if (Objects.isNull(order)) {
+                return HttpResult.error("订单不存在!");
             }
-        }
-        BigDecimal addActualAmount = order.getActualAmount();
-        if (Objects.nonNull(param.getActualAmount())) {
-            addActualAmount = addActualAmount.add(param.getActualAmount());
-            if (amount.compareTo(addActualAmount) < 0) {
-                return HttpResult.error("物流实际交付总量不可大于订单总量!");
+            if (!Objects.equals(String.valueOf(order.getStatus()), DictEnum.TORDER_STATUS_4.getValue())) {
+                return HttpResult.error("执行中的订单才可物流托运!");
             }
+            BigDecimal amount = order.getAmount();
+            BigDecimal addEntrustAmount = order.getEntrustAmount();
+            if (Objects.nonNull(param.getEntrustAmount())) {
+                addEntrustAmount = addEntrustAmount.add(param.getActualAmount());
+                if (amount.compareTo(addEntrustAmount) < 0) {
+                    return HttpResult.error("物流已委托总量不可大于订单总量!");
+                }
+            }
+            BigDecimal addActualAmount = order.getActualAmount();
+            if (Objects.nonNull(param.getActualAmount())) {
+                addActualAmount = addActualAmount.add(param.getActualAmount());
+                if (amount.compareTo(addActualAmount) < 0) {
+                    return HttpResult.error("物流实际交付总量不可大于订单总量!");
+                }
+            }
+            order.setEntrustAmount(addEntrustAmount).setActualAmount(addActualAmount).setUpdateBy(param.getUpdateBy());
+            //已履约量等于订单总量自动完结订单
+            if (amount.compareTo(addActualAmount) == 0) {
+                order.setStatus(Integer.valueOf(DictEnum.TORDER_STATUS_5.getValue()));
+                KwoTradeOrderTrack track = new KwoTradeOrderTrack();
+                track.setTOrderId(order.getId()).setTOrderNo(order.getTOrderNo()).setStatus(order.getStatus())
+                        .setCreateBy(updateBy).setUpdateBy(updateBy);
+                kwoTradeOrderTrackService.insert(track);
+            }
+            kwoTradeOrderService.updateById(order);
+            //更新mongodb
+            SckwTradeOrder updateParam = new SckwTradeOrder();
+            updateParam.setTOrderId(order.getId()).setEntrustAmount(addEntrustAmount).setActualAmount(addActualAmount)
+                    .setStatus(order.getStatus()).setUpdateBy(param.getUpdateBy()).setUpdateByName(param.getUpdateByName()).setUpdateTime(new Date());
+            saveMongoDb(3, updateParam);
+        } finally {
+            RedissonUtils.unlock(lockKey);
         }
-        order.setEntrustAmount(addEntrustAmount).setActualAmount(addActualAmount).setUpdateBy(param.getUpdateBy());
-        //已履约量等于订单总量自动完结订单
-        if (amount.compareTo(addActualAmount) == 0) {
-            order.setStatus(Integer.valueOf(DictEnum.TORDER_STATUS_5.getValue()));
-            KwoTradeOrderTrack track = new KwoTradeOrderTrack();
-            track.setTOrderId(order.getId()).setTOrderNo(order.getTOrderNo()).setStatus(order.getStatus())
-                    .setCreateBy(updateBy).setUpdateBy(updateBy);
-            kwoTradeOrderTrackService.insert(track);
-        }
-        kwoTradeOrderService.updateById(order);
-        //更新mongodb
-        SckwTradeOrder updateParam = new SckwTradeOrder();
-        updateParam.setTOrderId(order.getId()).setEntrustAmount(addEntrustAmount).setActualAmount(addActualAmount)
-                .setStatus(order.getStatus()).setUpdateBy(param.getUpdateBy()).setUpdateByName(param.getUpdateByName()).setUpdateTime(new Date());
-        saveMongoDb(3, updateParam);
         return HttpResult.ok();
     }
 

+ 15 - 11
sckw-modules/sckw-product/src/main/java/com/sckw/product/dubbo/GoodsInfoServiceImpl.java

@@ -48,25 +48,29 @@ public class GoodsInfoServiceImpl implements GoodsInfoService {
         if (CollectionUtils.isEmpty(list)) {
             return Collections.emptyMap();
         }
-        return list.stream().collect(Collectors.toMap(KwpGoods::getId, e->e, (k1, k2) -> k1));
+        return list.stream().collect(Collectors.toMap(KwpGoods::getId, e -> e, (k1, k2) -> k1));
     }
 
     @Override
     public HttpResult updateGoodsAmount(Long id, BigDecimal amount) {
         String lockKey = String.format(RedisConstant.GOODS_UPDATE_AMOUNT_KEY, id);
-        if (Boolean.FALSE.equals(RedissonUtils.tryLock(lockKey, 3L, 3L))) {
+        if (Boolean.FALSE.equals(RedissonUtils.tryLock(lockKey, 10L, 30L))) {
             return HttpResult.error("业务繁忙,请稍后再试!");
         }
-        com.sckw.product.model.KwpGoods goods = kwpGoodsService.selectById(id);
-        if (Objects.isNull(goods)) {
-            return HttpResult.error("商品不存在!");
+        try {
+            com.sckw.product.model.KwpGoods goods = kwpGoodsService.selectById(id);
+            if (Objects.isNull(goods)) {
+                return HttpResult.error("商品不存在!");
+            }
+            BigDecimal goodsAmount = goods.getAmount();
+            if (goods.getAmount().compareTo(amount) < 0) {
+                return HttpResult.error("商品库存不足,请联系供应方!");
+            }
+            goods.setAmount(goodsAmount.subtract(amount)).setPerformedAmount(Objects.nonNull(goods.getPerformedAmount()) ? goods.getPerformedAmount().add(amount) : amount);
+            kwpGoodsService.updateById(goods);
+        } finally {
+            RedissonUtils.unlock(lockKey);
         }
-        BigDecimal goodsAmount = goods.getAmount();
-        if (goods.getAmount().compareTo(amount) < 0) {
-            return HttpResult.error("商品库存不足,请联系供应方!");
-        }
-        goods.setAmount(goodsAmount.subtract(amount)).setPerformedAmount(Objects.nonNull(goods.getPerformedAmount()) ? goods.getPerformedAmount().add(amount) : amount);
-        kwpGoodsService.updateById(goods);
         return HttpResult.ok();
     }
 }