RabbitMQ 事务机制与消息限流实战
AMQP 协议的事务机制主要用于确保消息的原子性发布和确认。简单来说,它允许你将多个操作(如发送消息、确认消息)绑定在一起,要么全部成功,要么全部失败。
1. 事务配置
在 Spring Boot 中,RabbitMQ 自动配置默认开启确认模式,但 RabbitMQ 不允许同一个通道同时使用事务模式和确认模式。因此,我们需要显式禁用 publisher confirms,并启用事务模式。
关闭 Publisher Confirms
spring:
rabbitmq:
publisher-confirm-type: none
publisher-returns: false
配置事务模板与队列
我们需要创建一个专门用于事务的 RabbitTemplate,并设置 setChannelTransacted(true)。同时,配合 Spring 的 @Transactional 注解使用。
@RestController
@RequestMapping("/producer")
public class ProducerController {
@Resource(name = "transRabbitTemplate")
private RabbitTemplate transRabbitTemplate;
@Transactional
@RequestMapping("/trans")
public String trans() {
// 发送第一条消息
transRabbitTemplate.convertAndSend("", Constants.TRANS_QUEUE, "trans test ---> 1");
// 模拟业务异常,触发事务回滚
int num = 5 / 0;
// 如果上面抛出异常,这条消息不会发送
transRabbitTemplate.convertAndSend("", Constants.TRANS_QUEUE, "trans test ---> 2");
return "发送成功";
}
}
对应的 Bean 配置如下:
{
RabbitTemplate {
(connectionFactory);
rabbitTemplate.setChannelTransacted();
rabbitTemplate;
}
RabbitTransactionManager {
(connectionFactory);
}
}


