合作机构:阿里云 / 腾讯云 / 亚马逊云 / DreamHost / NameSilo / INWX / GODADDY / 百度统计
在DailyMart系统中,用户发起支付后,订单系统需要调用库存服务执行库存扣减逻辑。
由于这是跨服务调用,因此会产生分布式事务。在这里,我们使用RocketMQ的事务消息来实现分布式事务。
1、首先,在订单服务的应用服务层处理支付逻辑,并调用RocketMQ发送事务消息:
@Override
public String payment(String orderSn) {
// todo 集成支付宝支付
// 支付流水号
String outOrderNo = IdUtils.get32UUID();
TradeOrder tradeOrder = Optional.ofNullable(tradeOrderService.getByOrderSn(orderSn)).orElseThrow(() -> new BusinessException("订单编号不存在"));
// 如果订单处于待支付状态
if (Objects.equals(tradeOrder.getStatus(), OrderStatusEnum.WAITING_PAYMENT.getStatus())) {
OrderPaidEvent orderPaidEvent = new OrderPaidEvent(orderSn, outOrderNo);
TransactionSendResult sendResult = enhanceTemplate.sendTransaction("TRADE-ORDER", "ORDER-PAID");
if (SendStatus.SEND_OK == sendResult.getSendStatus() && sendResult.getLocalTransactionState() == LocalTransactionState.COMMIT_MESSAGE) {
return tradeOrder.getOrderSn();
} else {
throw new BusinessException("支付失败...");
}
} else {
throw new BusinessException("订单已支付,请勿重复提交...");
}
}
TOP