预期消息未发送的问题排查&解决

本文详细描述了一次由于引用对象在事务中被修改导致的消息发送错误问题。在事务处理过程中,由于消息发送的对象是引用,而在事务结束后发送消息时,对象状态已被其他方法改变,从而引发了消息内容错误。此问题的根本原因是引用对象被更新和消息的延时发送。解决方案在于避免在事务中使用可变引用进行消息内容构建,确保消息体在发送时反映的是事务开始时的状态。
摘要由CSDN通过智能技术生成

问题描述:每次订单状态变更会发出消息,消息消费方反馈,某订单未收到status=1的订单变更消息

排查过程:

1. 怀疑消息发送异常导致消息未发出,排查日志,无异常日志,先排除

2. 观察发出的消息日志,发现发出了2条status=4 的消息,猜测并不是消息未发出,而是发出的消息内容错误,某条status=4的消息,应该是status=1的消息体

3. 追代码逻辑,发现问题

在一个事务中进行了多次状态变更&消息发送,但是消息发送的对象是一个引用,引用对象被其他方法改变,已不是当时那一刻瞬时的数据了。

afterShipmentBuildCompletion方法会在本事务结束后发送订单状态改变的消息,shipmentChangeToTargetStatus方法会改变shipment的数据并发送订单状态改变的消息,等到afterShipmentBuildCompletion发消息时(事务结束后),shipment的值为shipmentChangeToTargetStatus改变后的数据,所以发了两条一样的数据。(shipmentChangeToTargetStatus一条、afterShipmentBuildCompletion一条)

4. 总结根本原因

引用对象被更改

消息的延时发送:事务结束后发送消息(如果按顺序执行,立即发送,后边的数据改了但是消息已经发出去了,不会有影响)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值