RabbitMQ基础(消息的可靠投递 - 退回模式)

8.1 YAML配置

spring:
  rabbitmq:
    host: 192.168.133.128
    port: 5672
    username: admin
    password: admin
    virtual-host: /
    publisher-returns: true # 开启消息投递的回退模式

8.2 代码实现

8.2.1 生产者

退回模式作用于发送方的消息确认模式作用于exchange和queue之间。首先还是需要保证的是YAML配置中的回退模式开关打开,然后需要回调ReturnCallback回调函数进行确认消息的发送情况。

import com.dream.config.RabbitMQConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.AmqpException;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessagePostProcessor;
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;
import org.springframework.test.context.junit4.SpringRunner;

@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringRabbitProducerTest {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    /**
     * 生产者消息发送退回模式 return
     * 发送方的消息确认模式作用于exchange和queue之间
     */
    @Test
    public void sender_test_return() {
        // 1、第一步需要在 ConnectionFactory 打开运行回退模式开关也就是 配置 publisher-returns
        // spring.rabbitmq.publisher-returns = true

        // 2、第二步是rabbitTemplate定义ConfirmCallBack回调函数
        // 3、设置一个exchange来处理消息的模式,两种模式
        // 3.1、如果消息没有路由到Queue就默认丢弃消息,默认模式
        // 3.2、如果消息没有路由到Queue就返回给消息的发送方ReturnCallback
        // 默认是setMandatory(false),需要将消息返回给发送方就设置成true
        rabbitTemplate.setMandatory(true);
        rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
            /**
             * 发送方的消息确认模式作用于生产者和exchange之间
             * @param message 消息对象
             * @param replyCode 返回的失败的状态码
             * @param replyText 返回的失败的信息
             * @param exchange 交换机
             * @param routingKey 路由key
             */
            @Override
            public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
                System.out.println("returnedMessage 被执行了....");
            }
        });

        // 4、发送消息进行测试
//        rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME, "11.TOPIC_BOOT.DREAM", "spring test rabbitmq confirm ....");

        for (int i = 1; i <= 50; i++) {
            rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME, "TOPIC_BOOT.DREAM", i + "   spring test rabbitmq confirm ....");
        }
    }
}
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章