赞
踩
一条消费成功被消费经历了生产者->MQ->消费者,因此在这三个步骤中都有可能造成消息丢失。
AMQP
协议提供了事务机制,在投递消息时开启事务支持,如果消息投递失败,则回滚事务。
自定义事务管理器
- @Configurationpublic class RabbitTranscation {
- @Bean public RabbitTransactionManager rabbitTransactionManager(ConnectionFactory connectionFactory){
- return new RabbitTransactionManager(connectionFactory); } @Bean public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory){
- return new RabbitTemplate(connectionFactory); }}
修改yml
spring: rabbitmq: # 消息在未被队列收到的情况下返回 publisher-returns: true
开启事务支持
rabbitTemplate.setChannelTransacted(true);
消息未接收时调用ReturnCallback
rabbitTemplate.setMandatory(true);
生产者投递消息
- @Servicepublic class ProviderTranscation implements RabbitTemplate.ReturnCallback {
- @Autowired RabbitTemplate rabbitTemplate; @PostConstruct public void init(){
- // 设置channel开启事务 rabbitTemplate.setChannelTransacted(true); rabbitTem
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。