问题描述:每次订单状态变更会发出消息,消息消费方反馈,某订单未收到status=1的订单变更消息
排查过程:
1. 怀疑消息发送异常导致消息未发出,排查日志,无异常日志,先排除
2. 观察发出的消息日志,发现发出了2条status=4 的消息,猜测并不是消息未发出,而是发出的消息内容错误,某条status=4的消息,应该是status=1的消息体
3. 追代码逻辑,发现问题
在一个事务中进行了多次状态变更&消息发送,但是消息发送的对象是一个引用,引用对象被其他方法改变,已不是当时那一刻瞬时的数据了。
afterShipmentBuildCompletion方法会在本事务结束后发送订单状态改变的消息,shipmentChangeToTargetStatus方法会改变shipment的数据并发送订单状态改变的消息,等到afterShipmentBuildCompletion发消息时(事务结束后),shipment的值为shipmentChangeToTargetStatus改变后的数据,所以发了两条一样的数据。(shipmentChangeToTargetStatus一条、afterShipmentBuildCompletion一条)
4. 总结根本原因
引用对象被更改
消息的延时发送:事务结束后发送消息(如果按顺序执行,立即发送,后边的数据改了但是消息已经发出去了,不会有影响)