RabbitMQ 第二天 高级 7 RabbitMQ 高级特性 7.6 延迟队列

news2024/12/26 14:32:50

RabbitMQ

【黑马程序员RabbitMQ全套教程,rabbitmq消息中间件到实战】

文章目录

      • RabbitMQ
      • 第二天 高级
      • 7 RabbitMQ 高级特性
        • 7.6 延迟队列
          • 7.6.1 延迟队列概述
          • 7.6.2 代码实现
          • 7.6.3 小结

第二天 高级

7 RabbitMQ 高级特性

7.6 延迟队列

7.6.1 延迟队列概述

【重点】

延迟队列,即消息进入队列后不会立即被消费,只有到达指定时间后,才会被消费。

常见的需求:

  • 下单后,30分钟未支付,取消订单,回滚库存。
  • 新用户注册成功7天后,发送短信问候。

[实现方式]

  1. 定时器【这种实现方式 其实并不优雅,定多长时间 不好确定、有误差,体验不好】
  2. 延迟队列

在这里插入图片描述

【优雅】

【但是非常 可惜的是,在RabbitMQ中并未提供延迟队列功能。】

但是!!!!!!可以使用:TTL+死信队列 组合实现延迟队列的效果。

在这里插入图片描述

【没毛病】

7.6.2 代码实现

修改生产端 的核心配置文件

<!--  延迟队列
        1. 定义正常交换机【order_exchange】和队列【order_queue】
        2. 定义死信交换机【order_exchange_dlx】和队列【order_queue_dlx】
        3. 绑定。设置正常队列 过期时间为 30 分钟
  -->
<!--  1. 定义正常交换机【order_exchange】和队列【order_queue】  -->
<rabbit:queue id="order_queue" name="order_queue">

    <!--    3. 绑定。设置正常队列 过期时间为 30 分钟    -->
    <rabbit:queue-arguments>
        <entry key="x-dead-letter-exchange" value="order_exchange_dlx"/>
        <entry key="x-dead-letter-routing-key" value="dlx.order.cancel"/>
        <entry key="x-message-ttl" value="10000" value-type="java.lang.Integer"/>
    </rabbit:queue-arguments>

</rabbit:queue>
<rabbit:topic-exchange name="order_exchange">
    <rabbit:bindings>
        <rabbit:binding pattern="order.#" queue="order_queue"></rabbit:binding>
    </rabbit:bindings>
</rabbit:topic-exchange>

<!--  2. 定义死信交换机【order_exchange_dlx】和队列【order_queue_dlx】  -->
<rabbit:queue id="order_queue_dlx" name="order_queue_dlx"></rabbit:queue>
<rabbit:topic-exchange name="order_exchange_dlx">
    <rabbit:bindings>
        <rabbit:binding pattern="dlx.order.#" queue="order_queue_dlx"></rabbit:binding>
    </rabbit:bindings>
</rabbit:topic-exchange>

OK

添加生产消息的 方法

@Test
public void testDelay(){
    
}

先运行一个另外的方法,让 rabbitMQ 把队列和交换机创建 出来

在这里插入图片描述

OK,查看交换机

在这里插入图片描述

查看绑定关系

在这里插入图片描述

没毛病

补全测试 方法

@Test
public void testDelay() throws InterruptedException {

    //1. 发送订单消息。【将来 是在订单系统中,下单成功后,发送消息】
    rabbitTemplate.convertAndSend("order_exchange","order.msg","您有一条新的订单 来咯~");

    //2. 打印倒计时10 s
    for (int i = 0; i < 10; i++) {
        System.out.println(i + "...");
        Thread.sleep(1000);
    }
}

这就是生产者了 ,为了看到效果,再来一个 消费者

package com.dingjiaxiong.listener;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
import org.springframework.stereotype.Component;

/**
 * ClassName: OrderListener
 * date: 2022/11/16 21:16
 *
 * @author DingJiaxiong
 */


@Component
public class OrderListener implements ChannelAwareMessageListener {

    @Override
    public void onMessage(Message message, Channel channel) throws Exception {

        long deliveryTag = message.getMessageProperties().getDeliveryTag();

        try {
            //1. 接收转换消息
            System.out.println(new String(message.getBody()));

            //2. 处理业务逻辑
            System.out.println("处理业务逻辑...");
            System.out.println("根据订单id 查询其状态...");
            System.out.println("判断状态是否为支付成功");
            System.out.println("取消订单,回滚库存...");

            //3. 手动签收
            channel.basicAck(deliveryTag, true);
        } catch (Exception e) {
//            e.printStackTrace();
            // 如果出现异常 4. 拒绝签收
            System.out.println("出现异常,拒绝签收");
            // 第三个参数:requeue:重回队列。如果设置为true,则消息重新回到queue,broker 会重新发送给该消息给消费端
            channel.basicNack(deliveryTag,true,false);

        }

    }
}

修改一下监听

<!--  定义监听器容器  -->
<rabbit:listener-container connection-factory="connectionFactory" acknowledge="manual" prefetch="1">
    <rabbit:listener ref="orderListener" queue-names="order_queue_dlx"></rabbit:listener>
</rabbit:listener-container>

OK。直接运行消费者

在这里插入图片描述

OK,这就在 监听 了

直接发送消息【笔者 这里上 一个动图】

在这里插入图片描述

OK,效果很明显【这就是利用 TTL + 死信队列(交换机) 实现的 延迟队列 的效果】

7.6.3 小结
  • 延迟队列 指消息进入队列后,可以被延迟一定时间,再进行消费。
  • RabbitMQ没有提供延迟队列功能,但是可以使用 : TTL + DLX 来实现延迟队列效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/113530.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode 剑指 Offer II 007. 数组中和为 0 的三个数

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i…

微信开放平台之第三方平台开发,从哪里入手?

大家好&#xff0c;我是悟空码字 疫情之下&#xff0c;最近有不少兄弟没有挺进决赛&#xff0c;半途成了小羊人&#xff0c;可谓是出师未捷身先死。话说回来&#xff0c;不管怎么样&#xff0c;尽量保护好自己&#xff0c;能越晚变羊越好。 开始说正事&#xff0c;不管是自己…

46_SDIO实验

目录 SDIO相关结构体 SDIO初始化结构体 SDIO命令初始化结构体 SDIO数据初始化结构体 硬件连接 实验源码 SDIO相关结构体 标准库函数对SDIO外设建立了三个初始化结构体&#xff0c;分别为SDIO初始化结构体SDIO_InitTypeDef, SDIO命令初始化结构体SDIO_CmdInitTypeDef和SD…

小技巧2:Python 实现阿拉伯数字转化为中文数字

大家好&#xff0c;我是Kamen Black君&#xff0c;今天给大家介绍一个小技巧&#xff1a;如何用Python 代码实现阿拉伯数字转化为中文数字。 都说光阴似箭&#xff0c;日月如梭&#xff0c;2022年的车轮很快也要驶向了终点。不知道大家在平常的生活中&#xff0c;有没有碰到过…

【Python】Beta分布详解

投硬币&#xff0c;硬币是正还是反&#xff0c;这属于两点分布的问题。 疯狂投硬币&#xff0c;正面出现的次数&#xff0c;服从二项分布&#xff1a;【Python】从二项分布到泊松分布 二项分布中&#xff0c;若特定时间内的伯努利试验次数趋于无穷大&#xff0c;那么在某一时…

【Linux】进程控制(进程创建、进程终止、进程等待、进程替换)

文章目录一、进程创建1.1 认识系统调用 fork1.2 理解 fork 的返回值1.3 写时拷贝策略二、进程终止2.1 main 函数的返回值2.2 进程退出的几种情况(&#x1f31f;)2.3 进程退出码2.4 终止正常进程&#xff1a;return、exit、_exit ⭐2.5 站在 OS 角度&#xff1a;理解进程终止三、…

RV1126笔记二十:吸烟行为检测及部署<七>

若该文为原创文章,转载请注明原文出处。 部署到RV1126,Demo测试 一、介绍 通过训练转换后,得到了RKNN模型,接下来使用rknn_model_zoo里自带的C demo来测试模型是不是可以在RV1126上运行。 C demo直接编译是编译不过的,需要自己移植. 根据C demo提供的README,可以看出…

7段数码管和打印机接口

目录 七段发光二级管显示器接口&#xff08;重点&#xff09; 打印机适配器&#xff08;重点&#xff09; 例题 补充两个芯片(了解&#xff09; 数据输出寄存器 数据输入三态缓冲器 七段发光二级管显示器接口&#xff08;重点&#xff09; 灯泡的题最难就是7段数码管。重点…

【Web开发】Python实现Web服务器(Ubuntu下调试Flask)

&#x1f37a;基于Python的Web服务器系列相关文章编写如下&#x1f37a;&#xff1a; &#x1f388;【Web开发】Python实现Web服务器&#xff08;Flask快速入门&#xff09;&#x1f388;&#x1f388;【Web开发】Python实现Web服务器&#xff08;Flask案例测试&#xff09;&a…

工厂卖家如何借助TikTok突围?

众所周知&#xff0c;TikTok已然成为全球最受欢迎的社交媒体之一&#xff0c;拥有巨大的流量池&#xff0c;对于跨境电商卖家来说&#xff0c;TikTok也是最大的站外流量来源。作为月活跃用户接近16亿的应用程序&#xff0c;TikTok的发展速度让很多社交媒体平台望尘莫及&#xf…

node.js+uni计算机毕设项目基于微信小程序寸金校园租车平台(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等…

rabbitmq基础6——交换器和队列web监控基础运维、备份交换机、消息确认机制、消息状态查看

文章目录一、交换器和队列的使用1.1 web监控创建交换器1.1.1 交换器参数1.1.2 备份交换器1.1.2.1 工作原理1.1.2.2 弊端情形1.2 web监控创建队列1.2.1 队列参数1.2.1.1 通用参数1.2.1.2 其他参数1.2.1.2.1 所有队列1.2.1.2.2 主队列1.2.1.2.3 仲裁队列1.2.1.2.4 流队列1.3 web监…

从原理和源码梳理Springboot FatJar 的机制

一、概述 SpringBoot FatJar 的设计&#xff0c;打破了标准 jar 的结构&#xff0c;在 jar 包内携带了其所依赖的 jar 包&#xff0c;通过 jar 中的 main 方法创建自己的类加载器&#xff0c;来识别加载运行其不规范的目录下的代码和依赖。 二、标准的 jar 包结构 打开 Java…

用html实现一个静态登陆页面-可根据需求更改样式

一、创建html文件&#xff0c;vscode下载相关插件 我们先选择一个文件夹创建login.html&#xff0c;.之前的文件命无所谓&#xff0c;.之后就必须为html或者htm。 在编辑改文件输入!且出现提示后按回车或按tab快捷生成基础代码。 然后我们下载一个可以方便我们开发的插件。 …

【计算机网络课程设计】TCP协议包自动生成工具【蒙混过关版】

文章目录引言设计要求分工安排文献查阅总体设计流程具体设计内容&#x1f315;博客x主页&#xff1a;己不由心王道长&#x1f315;! &#x1f30e;文章说明&#xff1a;TCP协议包自动生成工具&#x1f30e; ✅系列专栏&#xff1a;计算机网络 &#x1f334;本篇内容&#xff1a…

Linux系统基础——系统调用

Linux系统调用 特此说明: 刘超的趣谈linux操作系统是比较重要的参考资料&#xff0c;本文大部分内容和所有图片来源于这个专栏。 1 相关概念 程序vs进程vs命令: Linux系统上所有的操作由进程完成&#xff0c;进程的运行是动态的&#xff0c;在此之前是一个静态的程序。用户用一…

2年过去了,有谁还记得曾想取代Node.js的他?

大家好&#xff0c;我卡颂。 22年11月14日&#xff0c;Deno发布了v1.28&#xff0c;距离他第一个稳定版本v1.0.0发布&#xff08;2020年5月13日&#xff09;已过去2年。 作为Node.js的竞争者&#xff0c;Deno似乎并没有达到取代前者的目标。 甚至&#xff0c;他在前端社区的…

离散数学数理逻辑部分【1】

前言 本文创作的起因是&#xff0c;经历了离散数学的学习&#xff0c;深感学习离散之艰辛。所以产生了写一些内容帮助大家期末复习。虽然在csdn发表本文&#xff0c;有些不太合适&#xff0c;但是还是相信本文的质量和内容&#xff0c;可以给正在学习离散数学的大学生提供一些…

【数据结构】—— 队列(有序队列及环形队列的数组实现)

目录 队列的一个使用场景 什么是队列&#xff1f; 数组模拟队列 实现思路&#xff1a; 编写一个ArrayQueue类的代码实现过程 判断队列是否满和空 入队出队 显示队列数据 问题 用数组模拟队列你会发现使用一次之后就不能使用了 &#xff0c;没有达到复用的效果。 数组…

yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别

今天刚发表的一篇论文提出来了针对小目标和低分辨率图像检测性能提升的技术SPD-Conv&#xff0c;感觉还是挺有意义的&#xff0c;今天主要是基于这项技术融合进yolov5s模型中来开发对应的目标检测模型&#xff0c;实现五子棋的检测&#xff0c;本身五子棋就是比较密集的小目标检…