开发过程中遇到一个问题,事情是这样的,A ,B两个服务,A服务向数据库插入一条记录,并写入一条消息,即当前插入的数据至相应的交换机(先插入数据库后写入到mq)
然后B服务根据这个消息,去数据库查询当前写入的这条记录,结果发现,B服务从数据库中查询不到当前的这条记录;
分析原因: A插入数据的时候,虽然是先插入,后写入消息,但是由于消息消费很快,B在读取到这条消息去数据库查询的时候,A的事务还未提交,导致在B服务去数据库查询的时候,并没有查询到该条数据
解决办法: 让A服务器插入数据库,并提交事务之后,在写入mq的消息,就可以避免此类问题
上解决办法的代码:
//A服务中的数据保存之后,提交事务之后再写消息时候
// 插入数据
faceControlTaskDetailService.saveBatch(faceControlTaskDetailList);
// 写入消息
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
// 写入消息
}
});
rabbitmq保证消息不丢失
非常nice的rabbitmq消息确认退回文章