本文介绍: 1、简单的来理解,就是在上面简单模式下增加几个消费者,如同搬砖一样的,一个搬运工搬不过来,多叫几个人来干活的性质,避免消息堆积。2、生产者代码,运行下面的代码,查看可视化界面,并不存在消息,原因是因为需要手动创建。5、查看可视化界面进入死信队列的是时间最早的(也就是最先发送的)1、使用配置文件方式创建交换机队列,并且将他们绑定在一起。5、发送消息,观察可视化界面,时间到了就会进入到死信队列中。1、当队列名称写错了,或者不存在时候会出现这个情况。5、在发送消息的时候传递当前唯一识别

一、安装rabbitMQ

二、在spring-boot整合

三、简单模式

四、work工作模式

五、发布模式

一、Fanout模式
二、Direct模式
三、Topic模式

六、直接在监听上使用注解方式来创建交换机等

七、消息丢失

一、开启生产者确认机制
二、交换机到队列的时候出现问题
三、消息持久
四、消费者消费消息不丢失
八、消费限流

九、死信队列

  • 1、在下面几种情况下会产生死信队列

    • 消息的存活时间到了
    • 队列满了,比如队列只能放10个消息,这时候发送11个消息过来,就有一个消息为死信,在队列中时间最久的那个将为成为死信队列
    • 消费被拒绝了,或者rabbitmq返回uack
  • 2、死信队列的架构图

    在这里插入图片描述

  • 3、创建死信队列

    package com.example.config;
    
    import org.springframework.amqp.core.*;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class RabbitDlxExchangeConfiguration {
        // 创建一个死信交换机
        @Bean
        public Exchange dlxExchange() {
            return ExchangeBuilder.fanoutExchange("dlx_exchange").durable(true).build();
        }
    
        // 创建一个死信队列
        @Bean
        public Queue dlxQueue() {
            return QueueBuilder.durable("dlx_queue").maxLength(10).build();
        }
    
        // 死信交换机和死信队列绑定
        @Bean
        public Binding dlxQueueBinding() {
            return BindingBuilder.bind(dlxQueue()).to(dlxExchange()).with("dead").noargs();
        }
    
        // 创建一个正常的交换机
        @Bean
        public Exchange orderExchange() {
            return ExchangeBuilder.directExchange("order_exchange").durable(true).build();
        }
    
        // 创建一个正常队列
        @Bean
        public Queue orderQueue() {
            return QueueBuilder.durable("order_queue").
                    maxLength(10).
                    deadLetterExchange("dlx_exchange"). // 死信队列的交换机
                    deadLetterRoutingKey("dead"). // 死信队列的routingKey
                    build();
        }
    
        // 正常交换机和正常队列绑定
        @Bean
        public Binding orderQueueBinding() {
            return BindingBuilder.bind(orderQueue()).to(orderExchange()).with("info").noargs();
        }
    }
    
  • 4、发送消息

    @Test
    public void test05() throws InterruptedException {
        for (int i = 0; i < 15; i++) {
            rabbitTemplate.convertAndSend("order_exchange", "info", "hello world" + i);
        }
        Thread.sleep(2000);
    }
    
  • 5、查看可视化界面,进入死信队列的是时间最早的(也就是最先发送的)

    在这里插入图片描述

  • 6、定义消费者

    package com.example.listener05;
    
    import org.springframework.amqp.core.Message;
    import org.springframework.amqp.rabbit.annotation.RabbitListener;
    import org.springframework.stereotype.Component;
    
    @Component
    public class ConsumerListener01 {
        @RabbitListener(queues = "dlx_queue")
        public void listener01(Message message) {
            String msg = new String(message.getBody());
            System.out.println("接收到的死信队列消息:" + msg);
        }
    
        @RabbitListener(queues = "order_queue")
        public void listener02(Message message) {
            String msg = new String(message.getBody());
            System.out.println("接收到订单队列消息:" + msg);
        }
    }
    

十、延迟任务

  • 1、在rabbitmq没有真正意义上的延迟队列任务,只是采用ttl+死信队列来完成的

  • 2、延迟任务主要用于场景

  • 3、延迟任务的结构

    在这里插入图片描述

  • 4、创建一个延迟任务的队列

    @Configuration
    public class RabbitDlxExchangeConfiguration {
        ...
        @Bean
        public Queue orderQueue() {
            return QueueBuilder.durable("order_queue").
                    // maxLength(10).
                    ttl(2000). // 过期时间
                    deadLetterExchange("dlx_exchange"). // 死信队列的交换机
                    deadLetterRoutingKey("dead"). // 死信队列的routingKey
                    build();
        }
    }
    
  • 5、发送消息,观察可视化界面,时间到了就会进入到死信队列中

    @Test
    public void test06() throws InterruptedException {
        rabbitTemplate.convertAndSend("order_exchange", "info", "hello world");
        Thread.sleep(2000);
    }
    
  • 6、在死信队列中监听数据来改变数据库状态

原文地址:https://blog.csdn.net/kuangshp128/article/details/134676339

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_24900.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注