开发者学堂课程【RocketMQ 知识精讲与项目实战(第二阶段):订单微服务处理支付成功消息】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/703/detail/12439
订单微服务处理支付成功消息
内容介绍:
一、流程分析
二、处理消息
一、流程分析
开发消息处理,根据流程分析,在支付回调之后,需要在日志服务,用户服务和订单服务中接收当前支付成功的消息,分别进行一些处理,在接收服务时,消费方式是负载均衡还是广播?
考虑一个标准,是同时消费,还是一个消费即可,三个是不同的业务,分别对外进行消费,所以用的是广播的模式。业务处理有很多相似的地方,所以以订单服务为重点进行演示。
二、处理消息
支付成功后,支付服务 payService 发送 MQ 消息,订单服务、用户服务、日志服务需要订阅消息进行处理。
1、订单服务修改订单状态为已支付
2、日志服务记录支付日志
3、用户服务负责给用户增加积分
以下用订单服务为例说明消息的处理情况
(1)配置 RocketMQ 属性值
mq. pay. topic=payTopic
mq. pay. consumer . group. name=pay_ _payTopic group
打开代码找到订单服务,可以看到已经有了 RocketMQ 的配置
rocketmq.name-server=192.168.25.135:9876;192.168.25.138:9876
rocketmq. producer. group=orderProducerGroup
之前也配置过消费的消息,只不过消费方是在处理订单的下单异常这类消息,
mq. order . consumer . group . name=order orderTopic. _cancel _group
mq . order . topic=orderTopic
mq . order.tag. cancel=order_ cancel
重新加上跟支付相关的消费,topic 要和 payTopic 跟消息的发送方 Topic 保持一致。
mq. pay. topic=payTopic
mq. pay. consumer . group. name=pay_payTopic_group组
编写 listener,PaymentListener。
package com. itheima . shop. mq;
import org . apache. rocketmq . common.
message .MessageExt;
import org . apache . rocketmq. spring. core . RocketMQL istener;
//子类,两个都可以接收当前的消息,发送的是 message,而 MessagExt 是它的子类
//配置属性
@Slf4j 日志
@Component 注解
//通过广播的方式消费消息
@RocketMQMessageListener(topic = "${mq . pay . topic}" ,consumerGroup = "${mq. pay. consumer.
group .name}”,messageModel=MessageModel.
BROADCASTING)
public class PaymentListener implements
RocketMQListener <MessagExt>{
@Autowired
private TradeOrderMapper orderMapper;
@Override
public void onMessage(MessageExt messageExt) {
Log. info("接收到支付成功消息");
try{
//1.解析消息内容
String body = new String( messageExt . getBody(),
charsetName: "UTF-8");
//进行转换
TradePay tradePay, = JSON. parseObject(body,
TradePay.class);
//2.根据订单 ID 查询订单对象
TradeOrder tradeOrder=orderMapper.
selectByPrimaryKey(tradePay. getOrderId());
//3.更改订单支付状态为已支付
订单表中有订单的状态,pay_ status支付的状态
tradeOrder . setPayStatus (ShopCode . SHOP_ ORDER_ PAY_ STATUS_ IS_ PAY. getCode());
//4.更新订单数据到数据库
orderMapper . updateByPrimaryKey(tradeOrder);
Log. info("更改订单支付状态为已支付");
}catch (UnsupportedEncodingException e) {
e. printStackTrace();
}
}
}
订单支付成功后,在订单服务中通过消费消息的方式更改当前订单支付的状态。
(2)小结:
在订单微服务中,加了一个消息的消费者,目的是主要用来接收支付成功的消息,在配置文件中加了当前消息的topic 主题,起了消费者的组名,编写一个 listener,实现 rocketmqlistener,监听当前的 topic,指定组名以及当前消息的模型 BROADCASTING,解析消息,得到消息体,消息的内容是 tradepay,从中得到 orderid,查询出当前的order 对象,更改支付状态为已支付,把它更新到数据库,这就是接收到支付成功的消息,整个订单微服务中的处理。


