<!-- 分布式锁 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>lock4j-redis-template-spring-boot-starter</artifactId> <version>2.2.5</version> </dependency>
用法
@Autowired private LockTemplate lockTemplate; /** * 支付统一回调处理 */ public void payCallback() { CallbackLocal callbackInfo = PaymentContextLocal.get().getCallbackInfo(); // 加锁 LockInfo lock = lockTemplate.lock("callback:payment:" + callbackInfo.getOrderId(),10000, 200); if (Objects.isNull(lock)){ callbackInfo.setCallbackStatus(PayCallbackStatusEnum.IGNORE).setMsg("回调正在处理中,忽略本次回调请求"); log.warn("订单号: {} 回调正在处理中,忽略本次回调请求", callbackInfo.getOrderId()); return; } try { // 获取支付单 PayOrder payOrder = payOrderQueryService.findById(callbackInfo.getOrderId()).orElse(null); // 本地支付单不存在,记录回调记录, TODO 需要补单或进行退款 if (Objects.isNull(payOrder)) { callbackInfo.setCallbackStatus(PayCallbackStatusEnum.NOT_FOUND).setMsg("支付单不存在,记录回调记录"); return; } // 设置订单关联网关订单号 payOrder.setGatewayOrderNo(callbackInfo.getGatewayOrderNo()); // 成功状态 if (Objects.equals(PayCallbackStatusEnum.SUCCESS.getCode(), callbackInfo.getGatewayStatus())) { // 支付成功处理 this.success(payOrder); } else { // 失败状态 this.fail(payOrder); } } finally { lockTemplate.releaseLock(lock); } }
参数说明