rabbitmq高级特性 消息的可靠投递

概念


confirm模式简单使用

confirm模式会在消息传递后执行一个回调函数 通过回调函数的值我们可以判断是否正确投递消息给交换机
在boot整合rabbitmq基础之后 编辑配置开启confirm模式

spring:
  rabbitmq:
    host: 192.168.198.129
    port: 5672
    username: admin
    password: admin
    virtual-host: /
    publisher-confirm-type: correlated

编写回调函数

    @Autowired
    RabbitTemplate rabbitTemplate;
    @Test
    void contextLoads() {
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            /**
             *
             * @param correlationData
             * @param ack 确认交换机是否收到消息
             * @param s  失败原因
             */
            @Override
            public void confirm(CorrelationData correlationData, boolean ack, String s) {
                System.out.println("confirm方法被执行了");
                if(ack){
                    System.out.println("接受成功 "+s);
                }
                else {
                    System.out.println("接受失败 "+s);
                }
            }
        });
        rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME,"boot.haha","hello boot and mq");
    }

运行程序可以得知消息正确投递了

修改交换机名字为一个不存在的名字

运行程序

可以看到回调函数成功得知发送失败了
因此通过这种机制我们可以确保消息是否成功投递给交换机

return模式简单使用

return模式:
交换机路由到队列时,如果出现问题才会执行ReturnCallBack
开启return模式也需要我们手动去配置

配置开启return模式

spring:
  rabbitmq:
    host: 192.168.198.129
    port: 5672
    username: admin
    password: admin
    virtual-host: /
    publisher-confirm-type: correlated
    publisher-returns: true

默认为废弃原则 即出现问题直接不鸟了 要手动改为执行回调函数模式
rabbitTemplate.setMandatory(true);
编写回调函数并测试使用

    @Test
    void test2(){
        //默认为废弃原则 改为执行回调函数原则
        rabbitTemplate.setMandatory(true);
        rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
            @Override
            public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
                System.out.println("执行了return方法");
            }
        });
        rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME,"boot22.haha","hello boot and mq");
    }

这里routingKey是错误的 所以程序运行会执行回调函数

总结

confirm模式 确保了 broker到交换机消息传递成功
return模式 确保了交换机到队列消息传递成功
两者结合即可做到消息可靠投递

posted @ 2021-10-05 14:58  一个经常掉线的人  阅读(78)  评论(0)    收藏  举报