rabbitmq学习之路(四)

今天就说一下 如何防止消息丢失    防止消息丢失 分为 消息发送确认和消息消费确认,今天先说消息发送确认

 

经过我的了解,消息发送确认分为两个步骤,消息到达交换机和消息到达队列,这是两个分开的步骤

 

直接上代码来介绍,要开启消息发送确认需要在配置上增加这两项

#开启生产者消息确认机制
spring.rabbitmq.publisher-confirms=true
spring.rabbitmq.publisher-returns=true

 

我们需要知道两个接口,

RabbitTemplate.ConfirmCallback 
RabbitTemplate.ReturnCallback


第一个接口,对应着消息到达交换机这一步,第二个接口,对应着消息到达队列这一步

@Service
public class ConfirmCallBackListener implements RabbitTemplate.ConfirmCallback {


    @Autowired
    private RabbitTemplate rabbitTemplate;

    @PostConstruct
    public void init(){
        rabbitTemplate.setConfirmCallback(this);
    }


    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        System.out.println("消息唯一标识:"+correlationData);
        System.out.println("确认结果:"+ack);
        System.out.println("失败原因:"+cause);
    }
}
@Service
public class ReturnCallBackListener implements RabbitTemplate.ReturnCallback{



    @Autowired
    private RabbitTemplate rabbitTemplate;

    @PostConstruct
    public void init(){
        rabbitTemplate.setReturnCallback(this);
    }

    @Override
    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
        System.out.println("return--message:" + new String(message.getBody()) + ",replyCode:" + replyCode + ",replyText:" + replyText + ",exchange:" + exchange + ",routingKey:" + routingKey);
    }
}

 

就是这么简单,配置完成之后,一旦消息成功到达交换机,confirmCallBack 收到的ack就是true,如果没有到达交换机,收到的ack就是false

如果消息到达了队列,那么returnCallBack不会收到任何消息,如果消息到达不了队列(路由不到队列等),就会触发回调

 

我在查资料的时候发现,有一篇文章说需设置mandatory=true,否则不会触发returncallback的回调,不太清楚,需要继续查资料

 

posted on 2019-08-04 20:09  敲代马  阅读(359)  评论(0编辑  收藏  举报

导航