Commit fdb9daa6 by 刘鹏飞

创建订单添加redis锁,防止重复创建订单

parent 59a95283
...@@ -53,4 +53,12 @@ public class LockUtils { ...@@ -53,4 +53,12 @@ public class LockUtils {
}); });
} }
/**
* 解锁 无论是否加锁成功,都需要调用unlock 应该以: lock(); try { doSomething(); } finally {
* unlock(); } 的方式调用
*/
public static void unlock(RedisTemplate redisTemplate,String lockKey) {
redisTemplate.delete(lockKey);
}
} }
...@@ -159,6 +159,7 @@ public enum ResponseResult { ...@@ -159,6 +159,7 @@ public enum ResponseResult {
ORDER_TAKE_OUT_TIME_ERROR("450062", "你的外卖送达时间异常,请重新选择!"), ORDER_TAKE_OUT_TIME_ERROR("450062", "你的外卖送达时间异常,请重新选择!"),
ORDER_TAKE_OUT_ADDRESS_NOT_VALID("45063", "收货地址校验失败"), ORDER_TAKE_OUT_ADDRESS_NOT_VALID("45063", "收货地址校验失败"),
ORDER_PICK_UP_GOOD_NO("45064", "更新取餐码失败"), ORDER_PICK_UP_GOOD_NO("45064", "更新取餐码失败"),
ORDER_NOT_CREATE_ERROR("45065", "请不要重复创建订单"),
/** /**
* 支付 * 支付
......
...@@ -49,11 +49,22 @@ public class OrderAdapterServiceImpl implements OrderAdapterService { ...@@ -49,11 +49,22 @@ public class OrderAdapterServiceImpl implements OrderAdapterService {
private final String PAY_SUCCESS_KEY = "pay_success_key:"; private final String PAY_SUCCESS_KEY = "pay_success_key:";
/**
* 下单检查key,防止重复下单
*/
private final String CREATE_ORDER_KEY = "create_order_key:";
private static Gson gson = new Gson(); private static Gson gson = new Gson();
@Value("${mccafe.partner.id}") @Value("${mccafe.partner.id}")
private String mcCafePartnerId; private String mcCafePartnerId;
/**
* 创单锁定的key
*/
@Value("${create.order.key.expire}")
private String createOrderKeyExpire;
@Autowired @Autowired
private EncircleOrderService encircleOrderService; private EncircleOrderService encircleOrderService;
@Autowired @Autowired
...@@ -129,7 +140,23 @@ public class OrderAdapterServiceImpl implements OrderAdapterService { ...@@ -129,7 +140,23 @@ public class OrderAdapterServiceImpl implements OrderAdapterService {
if(ObjectUtils.notEqual(baseResponse.getCode(),ResponseResult.SUCCESS.getCode())){ if(ObjectUtils.notEqual(baseResponse.getCode(),ResponseResult.SUCCESS.getCode())){
return baseResponse; return baseResponse;
} }
return orderService.createOrderNew(createOrderVo);
// 添加分布式锁,如果没有取得锁直接返回失败;整个方法执行完毕后会删掉该锁
// 锁定秒数从apollo获取,如果apollo没有设置,默认5秒
String createOrderKey = CREATE_ORDER_KEY + assortmentCustomerInfoVo.getMemberId();
try {
Long expire = StringUtils.isNotBlank(createOrderKeyExpire) ? Long.valueOf(createOrderKeyExpire) : 5L;
if(!LockUtils.lock(redisCache.getRedisTemplate(),createOrderKey,expire)){
return ResponseUtil.error(ResponseResult.ORDER_NOT_CREATE_ERROR);
}
return orderService.createOrderNew(createOrderVo);
} catch (Exception e) {
log.error("创建订单失败,trackingNo:{}", LogTreadLocal.getTrackingNo());
} finally {
LockUtils.unlock(redisCache.getRedisTemplate(),createOrderKey);
}
return ResponseUtil.error(ResponseResult.ORDER_CREATE_ERROR);
} }
......
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