mq-死信队列实现消息延迟(代码片段)

啃瓜子的松鼠 啃瓜子的松鼠     2022-12-11     490

关键词:

死信队列实现消息延迟

一、延迟队列

延迟队列:消息进入到队列之后,延迟指定的时间才能被消费者消费。

AMQP协议和RabbitMQ队列本身是不支持延迟队列功能的,但是可以通过TTL(Time To Live)特性模拟延迟队列的功能。

TTL就是消息的存活时间,RabbitMQ可以分别对队列和消息设置存活时间。

  • 在创建队列的时候可以设置队列的存活时间,消息进入队列后,在存活时间内没有被消费者消费,则此消息会从当前队列移除。
  • 创建消息队列没有设置TTL,但是消息设置了TTL,那么当消息的存活时间结束,也会被移除。
  • 当TTL结束之后,我们可以指定将当前队列的消息转存到其他指定的队列。

二、使用延迟队列实现订单支付监控

  • 实现流程图如图:

  • 创建路由交换机

  • 创建消息队列

  • 创建死信队列

  • 队列绑定

  • 发送消息到交换机delay_exchange的k1(即消息队列delay_queue1)

    //普通maven项目演示
    //发送消息
    public class SendMsg 
    
        public static void main(String[] args) 
            System.out.println("请输入消息:");
            Scanner input = new Scanner(System.in);
            String msg = input.nextLine();
    
            Connection connection = null;
    
            try 
                //获取连接,相当于JDBC的获取数据库连接
                connection = MQUtil.getConnection();
     
                Channel channel = connection.createChannel();
    
                //发消息之前开启消息确认
                channel.confirmSelect();
    
                channel.basicPublish("delay_exchange","k1",null,msg.getBytes());
    
                //消息发送之后等待消息反馈
                try 
                    boolean b = channel.waitForConfirms();
                    System.out.println("发送--->" + msg + (b ? "成功": "失败"));
                 catch (InterruptedException e) 
                    e.printStackTrace();
                
    
                //关闭
                channel.close();
                connection.close();
    
             catch (IOException e) 
                e.printStackTrace();
             catch (TimeoutException e) 
                e.printStackTrace();
            
    
    

    发送消息:


此时开启接收队列delay_queue2(而不是delay_queue1)的消息:会发现不能实时接收,需要等到delay_queue1的TTL时间到后才能成功接收到消息。

//普通maven项目演示
//接受消息
public class ReceiveMsg 

    public static void main(String[] args) 

        Connection connection = null;

        //获取连接,相当于JDBC的获取数据库连接
        try 
            connection = MQUtil.getConnection();
            Channel channel = connection.createChannel();

            //声明要关注的队列
            //channel.queueDeclare("queue1", false, false, false, null);
            //DefaultConsumer类实现了Consumer接口,通过传入一个频道,
            // 告诉服务器我们需要那个频道的消息,如果频道中有消息,就会执行回调函数handleDelivery
            Consumer consumer = new DefaultConsumer(channel) 
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException 
                    String message = new String(body, "UTF-8");
                    System.out.println("consumer2消费消息:'" + message + "'");
                
            ;
            //自动回复队列应答 -- RabbitMQ中的消息确认机制
            channel.basicConsume("delay_queue2", true, consumer);

         catch (IOException e) 
            e.printStackTrace();
         catch (TimeoutException e) 
            e.printStackTrace();
        
    

由于在前面创建死信队列设置的delay_queue1的TTL时间为10s,因此间隔10s后成功接收到消息:


演示完毕!

利用rabbitmq的死信队列实现延时消息(代码片段)

mq基本的消息模型mq死信队列的消息模型简单的说就是先弄一个正常队列,然后不要设置消费者,接着给这个正常队列绑定一个死信队列,这个死信队列设置方式和正常队列没啥区别。然后监听这个死信队列的消费.一... 查看详情

rabbitmq之消息可靠性死信交换机惰性队列及集群(代码片段)

...认2.消息持久化3.消费者消息确认4.消费失败重试机制二.死信交换机1.死信2.TTL3.延迟队列三.惰性队列1.消息堆积问题2.惰性队列四.MQ集群1.集群分类2.普通集群3.镜像集群4.仲裁队列MQ的一些常见问题消息可靠性问题:如何确保发... 查看详情

使用rabbitmq的死信队列实现延迟消息(代码片段)

...了上一篇《使用RabbitMQ插件实现延迟队列》外,使用死信队列也是一种方案.TimeToLive:可以在发送消息时设置过期时间,也可以设置整 查看详情

rabbitmq-消息可靠性&延迟消息

...制3、消息持久化4、消费者确认消息5、失败重试机制三、死信交换机1、死信2、死信交换机3、TTL4、死信交换机&TTL代码实现四、延迟消息1、延迟队列2、应用场景3、延迟队列插件安装4、延迟队列代码实现5、修改延时消息报异... 查看详情

使用rabbitmq的死信队列实现延迟消息(代码片段)

...了上一篇《使用RabbitMQ插件实现延迟队列》外,使用死信队列也是一种方案.TimeToLive:可以在发送消息时设置过期时间,也可以设置整个队列的过期时间,如果两个同时设置已最早过期时间为准。DeadLetterExchangesÿ... 查看详情

一篇带您搞懂mq延迟队列实战操作(代码片段)

文章目录前言RabbitMq专栏直通车MQ-死信队列(延迟操作)外加消息确认模式死信队列消息模型构建大概有几步?01::前期准备:引入相关依赖02::整合RabbitMQ02::01-加入RabbitMq相关配置03::创建真实队列--交换机、队列、绑定,和确认消费... 查看详情

rabbitmq之消息可靠性死信交换机惰性队列及集群(代码片段)

...认2.消息持久化3.消费者消息确认4.消费失败重试机制二.死信交换机1.死信2.TTL3.延迟队列三.惰性队列1.消息堆积问题2.惰性队列四.MQ集群1.集群分类2.普通集群3.镜像集群4.仲裁队列MQ的一些常见问题消息可靠性问题:如何确保发... 查看详情

「mq实战」rabbitmq延迟队列,消息延迟推送

...统的整体性能和吞吐量:在RabbitMQ3.6.x之前我们一般采用死信队列+TTL过期时间来实现延迟队列,我们这里不做过多介绍,可以参考之前文章来了解:TTL、死信队列在RabbitMQ3.6.x开始,RabbitMQ官方提供了延迟队列的插件,可以下载放... 查看详情

扩展自定义mq组件,使用rabbitmq_delayed_message_exchange延迟组件,完善消息延迟消息精度问题(代码片段)

...机或其他问题会导致消息的丢失,本想系采用延迟队列和死信队列完成消息的延迟消费,但这种方案存在一定的局限性,当队列中第一个消息未过期时,后面过期了的消息也不会投递到死信队列中,这样会造成消息的阻塞,这种方案对时... 查看详情

springboot集成rabbitmq之死信队列限流队列延迟队列(第四节)(代码片段)

目录 开始语📝简述🖋️代码实现-死信队列application配置Argument枚举User对象死信队列生产者消费者结果验证🖋️代码实现-延时队列延迟队列生产者消费者结果验证🖋️代码实现-限流队列限流队列生产者消费者-... 查看详情

springboot整合rabbitmq实现死信队列(代码片段)

文章目录概念介绍什么是死信死信队列应用工程搭建环境说明搭建步骤实现死信准备Exchange&Queue监听死信队列方式一——消费者拒绝&否认方式二——超过消息TTL方式三——超过队列长度限制代码仓库前面一文通过Java整合Rab... 查看详情

浅谈rabbitmq——死信队列与延迟队列(代码片段)

死信队列引言死信队列,英文缩写:DLX。DeadLetterExchange(死信交换机),其实应该叫做死信交换机才更恰当。当消息成为Deadmessage后,可以被重新发送到另一个交换机,这个交换机就是DLX。总结:其... 查看详情

mq死信队列

RabbitMQ死信队列俗称,备胎队列;消息中间件因为某种原因拒收该消息后,可以转移到死信队列中存放,死信队列也可以有交换机和路由key等。产生死信队列的原因消息投递到MQ中存放消息已经过期队列达到最大的长度(队列容... 查看详情

rabbitmq实现延迟发送消息

...功能,本着试试的心态开始研究,第一个想到的就是使用死信队列死信队列何为死信队列,其实rabbitmq本身并不能实现延迟发送消息的功能,不过因为本身有着队列ttl+死信exchange的机制,可以借助这个机制实现延迟发送消息原理... 查看详情

浅谈rabbitmq——死信队列与延迟队列(代码片段)

死信队列引言死信队列,英文缩写:DLX。DeadLetterExchange(死信交换机),其实应该叫做死信交换机才更恰当。当消息成为Deadmessage后,可以被重新发送到另一个交换机,这个交换机就是DLX。总结:其... 查看详情

rabbitmq--死信队列/延迟队列--使用/原理(代码片段)

原文网址:RabbitMQ--死信队列/延迟队列--使用/原理_IT利刃出鞘的博客-CSDN博客简介    本文介绍RabbitMQ的死信队列和延迟队列。    本内容也是Java后端面试中常见的问题。死信队列简介        DLX,全称为Dead-Letter-Ex... 查看详情

rrabbitmq05_消息可靠性投递ack限流处理ttl队列死信交换机延迟队列(代码片段)

...K-消费端③.限流处理limit-消费端④.TTL过期队列-生产端⑤.死信队列-交换机⑥.延迟队列-ttl+死信①.消息可靠性投递-生产端①.在使用RabbitMQ的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ为我们提供了... 查看详情

rabbitmq学习(中)——交换机死信队列和延迟队列(代码片段)

RabbitMQ学习(中)——交换机、死信队列和延迟队列一、交换机1.1Fanoutexchange(发布/订阅模式)1.2Directexchange(路由模式)1.3Topics模式二、死信队列2.1死信之TTl2.2死信之最大长度2.3死信之消息被拒三、延迟... 查看详情