MQ死信队列&&延迟队列

什么是死信队列

  1. 消息的存活时间到了
  2. 队列满了(是哪一个消息会成为死信?) 等待最久的消息会成为死信消息
  3. 消费被拒绝了,或者给 rabbitmq 返回 ack ,并且
    requeue 设置为 false

默认情况下,rabbitmq 对死信的处理就是直接丢弃

如果在创建某个队列的时候,给队列设置了死信队列,那么此时如果一个消息成为了死信,那么对 rabbitmq 就会吧这个死信存储在死信队列中。


package com.atguigu.rabbit.producer.configuration;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author AlenLin
 * @version 1.0
 * @DESCRIPTION TODO
 * @date 2024/4/8 14:56
 */


@Configuration
public class RabbitmaProducerDLConfiguration {

    /**
     * 死信交换机
     */
    @Bean
    public Exchange dlxExchange() {
        Exchange dlxExchange = ExchangeBuilder.directExchange("dlx_exchange").durable(true).build();
        return dlxExchange;
    }

    @Bean
    public Queue dlxQueue() {
        Queue dlxQueue = QueueBuilder.durable("dlx_queue").build();
        return dlxQueue;
    }

    @Bean
    public Binding dlxQueueBinding() {
        Binding dlxBinding = BindingBuilder.bind(dlxQueue()).to(dlxExchange()).with("dead").noargs();
        return dlxBinding;
    }

    /**
     * 正常的交换机
     */
    @Bean
    public Exchange orderExchange() {
        Exchange exchange = ExchangeBuilder.directExchange("order_exchange").durable(true).build();
        return exchange;
    }

    @Bean
    public Queue orderQueue() {
        Queue queue = QueueBuilder.durable("order_queue")
                .maxLength(10)
                .deadLetterExchange("dlx_exchange") //设置死信交换机
                .deadLetterRoutingKey("dead")//设置死信 routingKey
                .build();
        return queue;
    }

    @Bean
    public Binding orderQueueBinding() {
        Binding binding = BindingBuilder.bind(orderQueue()).to(orderExchange()).with("info").noargs();
        return binding;
    }

}
@SpringBootTest(classes = ProducerApplication.class)
public class ProducerTset08 {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void test01() {
        for (int i = 0; i < 11; i++) {
            rabbitTemplate.convertAndSend("order_exchange", "info", "hello confirm order_exchange ..." + (i + 1));
        }
    }


}

在这里插入图片描述

延迟队列

延迟队列的作用

存储延迟消息 例如:微信公众号文章的延迟发布、火车票未支付订单到时间自动取消等

rabbitmq 的没有提供没有真正意义上的延迟队列,需要通过 ttl + 死信队列来实现
在这里插入图片描述

@Configuration
public class RabbitmaProducerDLConfiguration {

    /**
     * 死信交换机
     */
    @Bean
    public Exchange dlxExchange() {
        Exchange dlxExchange = ExchangeBuilder.directExchange("dlx_exchange").durable(true).build();
        return dlxExchange;
    }

    @Bean
    public Queue dlxQueue() {
        Queue dlxQueue = QueueBuilder.durable("dlx_queue").build();
        return dlxQueue;
    }

    @Bean
    public Binding dlxQueueBinding() {
        Binding dlxBinding = BindingBuilder.bind(dlxQueue()).to(dlxExchange()).with("dead").noargs();
        return dlxBinding;
    }

    /**
     * 正常的交换机
     */
    @Bean
    public Exchange orderExchange() {
        Exchange exchange = ExchangeBuilder.directExchange("order_exchange").durable(true).build();
        return exchange;
    }

    @Bean
    public Queue orderQueue() {
        Queue queue = QueueBuilder.durable("order_queue")
               // .maxLength(10)
                .ttl(20000)//设置消息的存活时间
                .deadLetterExchange("dlx_exchange") //设置死信交换机
                .deadLetterRoutingKey("dead")//设置死信 routingKey
                .build();
        return queue;
    }

    @Bean
    public Binding orderQueueBinding() {
        Binding binding = BindingBuilder.bind(orderQueue()).to(orderExchange()).with("info").noargs();
        return binding;
    }

}
@Component  //spring 容器进行管理

public class ConsumerListener01 {
    @RabbitListener(queues = "dlx_queue")//接收消息
    public void listener01(Message message, Channel channel) {
        byte[] body = message.getBody();
        String str = new String(body);//字节数组 转化为字符串
        long deliverryTag = message.getMessageProperties().getDeliveryTag();//获取消息的标签

        try {
            System.out.println("ConsumerListener01...msg --------->" + str);
            channel.basicAck(deliverryTag, true);
        } catch (IOException e) {
            e.printStackTrace();
            try {
                channel.basicNack(deliverryTag, true, true);
            } catch (IOException ex) {
                e.printStackTrace();
            }
        }

    }
}

相关推荐

最近更新

  1. Linux系统管理面试题

    2024-04-10 00:42:03       0 阅读
  2. IO练习网络爬虫获取

    2024-04-10 00:42:03       0 阅读
  3. C++设计模式---备忘录模式

    2024-04-10 00:42:03       0 阅读
  4. WHAT - React useEffect 依赖的 Object.is

    2024-04-10 00:42:03       0 阅读

热门阅读

  1. 吴军《格局》对我的3点帮助

    2024-04-10 00:42:03       14 阅读
  2. 深入了解Linux: dbus-daemon系统总线的作用与管理

    2024-04-10 00:42:03       13 阅读
  3. Leetcode 165. 比较版本号

    2024-04-10 00:42:03       14 阅读
  4. pandas中apply() 函数的应用

    2024-04-10 00:42:03       13 阅读
  5. css 响应式布局重学笔记

    2024-04-10 00:42:03       15 阅读
  6. Google HTML/CSS 风格指南

    2024-04-10 00:42:03       11 阅读
  7. vue3 开发中遇到的问题

    2024-04-10 00:42:03       15 阅读
  8. go 搭建api后台笔记

    2024-04-10 00:42:03       13 阅读
  9. Leetcode面试经典150_Q169多数元素

    2024-04-10 00:42:03       16 阅读
  10. vivado 设计调试

    2024-04-10 00:42:03       18 阅读