1-8 (3). RabbitMQ高级特性-消息可靠性投递

RabbitMQ的消息投递路径为:
producer–>rabbitmq broker–>exchange–>queue–>consumer

RabbitMQ提供了两种方式用来控释消息投递的可靠性模型
(1)confirm 确认模式
(2)return 退回模式
分别为:
(1)消息从producer到exchange,会返回一个confirmCallback
(2)消息从exchange到queue投递失败则返回一个returnCallback

1.confirm 确认模式

测试:
首先通过配置文件开启消息投递确认机制,默认是不开启的。

# 配置RabbitMQ的基本信息
spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
    virtual-host: /
    # 消息投递确认机制
    publisher-confirm-type: correlated

none值是禁用发布确认模式,是默认值
correlated值是发布消息成功到交换器后会触发回调方法
simple值经测试有两种效果,其一效果和correlated值一样会触发回调方法,其二在发布消息成功后使用rabbitTemplate调用waitForConfirms或waitForConfirmsOrDie方法等待broker节点返回发送结果,根据返回结果来判定下一步的逻辑,要注意的点是waitForConfirmsOrDie方法如果返回false则会关闭channel,则接下来无法发送消息到broker;

package cn.sysu;

import cn.sysu.config.RabbitMQComfig;
import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class ProducerApplicationTest {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    void contextLoads() {
        
        rabbitTemplate.convertAndSend(RabbitMQComfig.EXCHANGE_NAME,"test1.hello","test-message1");
        rabbitTemplate.convertAndSend(RabbitMQComfig.EXCHANGE_NAME,"test2.word","test-message2");
    }

    @Test
    void testConfirm() {
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            @Override
            public void confirm(CorrelationData correlationData, boolean b, String s) {
                System.out.println("消息投递后执行confirm方法");
                System.out.println(correlationData);
                System.out.println(b);
                System.out.println(s);
            }
        });
        rabbitTemplate.convertAndSend(RabbitMQComfig.EXCHANGE_NAME,"test1.hello","test-confirm");
    }

}


correlationData:相关配置信息
boolean b:是否发送成功
String s:失败原因

2.return 回退模式

回退是当exchange中的消息路由到queue失败后才执行ReturnCallback
测试
(1)设置配置文件

# 配置RabbitMQ的基本信息
spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
    virtual-host: /
    # 消息投递确认机制
    publisher-confirm-type: correlated
    # 消息投递回退机制
    publisher-returns: true

(2)设置ReturnCallback,并设置Exchange处理消息的模式
如果消息没有路由到queue,则丢弃消息(默认)
如果消息没有路由到queue,则返回给消息发送方ReturnCallBack,
因此需要设置,不能默认。

@Test
 void testReturn() {
     //设置交换机处理失败消息的模式
     rabbitTemplate.setMandatory(true);

     rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
         @Override
         public void returnedMessage(Message message, int i, String s, String s1, String s2) {
             System.out.println("return方法执行了");
         }
     });
     rabbitTemplate.convertAndSend(RabbitMQComfig.EXCHANGE_NAME,"test3.ming","test-return");
 }

在这里插入图片描述

博主的坚持 离不开大家评论和点赞,感谢大家支持!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值