RabbitMQ提高消息投递可靠性

RabbitMQ提供了两种方式类控制消息投递的可靠性模式

1、Confirm —确认模式(ConfirmCallback)

2、Return —回退模式(ReturnCallback)

rabbitMQ整个消息投递流程:(这两种方式即可保证消息投递可靠性)

在这里插入图片描述

Spring.xml中的配置:
在这里插入图片描述

 <!-- 定义rabbitmq connectionFactory -->
    <rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}"
                               port="${rabbitmq.port}"
                               username="${rabbitmq.username}"
                               password="${rabbitmq.password}"
                               virtual-host="${rabbitmq.virtual-host}"
                               publisher-confirms="true"
                               publisher-returns="true"
    />
    <!--定义管理交换机、队列-->
    <rabbit:admin connection-factory="connectionFactory"/>

    <!--消息可靠性投递处理 (生产端)-->
    <rabbit:queue id="test_queue_confirm" name="test_queue_confirm" />

    <rabbit:direct-exchange  name="spring_exchange_confirm">
        <rabbit:bindings>
            <rabbit:binding queue="test_queue_confirm" key="confirm"/>
        </rabbit:bindings>
    </rabbit:direct-exchange>

测试代码:

package com.study;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * @Author hekunming
 * @Date 2021/11/19 21:24
 * @Copyright
 */

//@RunWith ---就是一个运行器 SpringJUnit4ClassRunner.class 让测试运行于Spring测试环境,以便在测试开始的时候自动创建Spring的应用上下文
@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration ---注解引入配置文件
@ContextConfiguration(locations = "classpath:spring-rabbitmq-producer.xml")
public class ProducerTest2 {

    //1.注入RabbitTemplate
    @Autowired
    private RabbitTemplate rabbitTemplate;


    /**
     * 确认模式:
     *  步骤:
     *     1、确认开启:connection-factory中的publisher-confirms="true"
     *     2、在rabbitTemplate定义ConfirmCallBack回调函数
     *
     */

    @Test
    public void testConfirm(){

        //2、定义回调函数
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            /**
             *
             * @param correlationData  相关配置信息
             * @param b  exchange交换机是否成功收到消息 。true 成功 false 失败
             * @param s  失败原因
             */
            @Override
            public void confirm(CorrelationData correlationData, boolean b, String s) {
                System.out.println("confirm方法被执行了。。。");
                if(b){
                    //接收成功
                    System.out.println("接收成功"+s);
                }else{
                    //接收失败
                    System.out.println("接收失败"+s);
                }
            }
        });
        //3、发送消息
        rabbitTemplate.convertAndSend("spring_exchange_confirm","confirm1","massage confirm...");

    }


    /**
     * 回退模式:当消息发送给Exchange后,Exchange路由到queue失败时才会执行ReturnCallBack
     * 步骤:
     *     1、开启回退模式 publisher-returns="true"
     *     2、设置ReturnCallBack
     *     3、设置Exchange处理消息的模式
     *         1、如果消息没有路由到Queue,则丢弃消息(默认)
     *         2、如果消息没有路由到Queue,返回给消息发送方
     */
    @Test
    public void testReturn(){

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

        //2.设置ReturnCallBack
        rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
            @Override
            public void returnedMessage(Message message, int i, String s, String s1, String s2) {
                System.out.println("ReturnCallback被执行了....");
                System.out.println(message);
                //处理

            }
        });


        //3、发送消息
        rabbitTemplate.convertAndSend("spring_exchange_confirm","confirm1","massage confirm...");

    }



}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值