rabbitmq的延迟队列spring配置(单exchange,多queue)

Spring Boot + RabbitMQ + rabbitmq_delayed_message_exchange插件实现延迟队列 最近在实现一个业务,就是需要做到消息延迟推送,在Java 多线程并发开发过程中,了解到DelayQueue类的:是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。注意:不能将null元素放置到这种队列中。然后再开一个扫描线程去轮询,就可以实现延迟消息的处理了,但是这样子做有一个弊... 阅读详情
    <!-- 订单通知服务队列 -->
	<!-- 创建rabbit ConnectionFactory,连接服务器 -->
	<rabbit:connection-factory id="connectionFactory"
		host="${rabbitmq.host}" username="${rabbitmq.username}" password="${rabbitmq.password}" 
		port="${rabbitmq.port}" virtual-host="${rabbitmq.vhost}" />
	
	<!-- 队列声明 -->
	<rabbit:queue id="queue_TestNotify" name="queue_TestNotify" durable="true" auto-delete="false" exclusive="false">
	    <rabbit:queue-arguments>
	        <entry key="x-dead-letter-exchange" value="trade_direct"/>
	    	<entry key="x-dead-letter-routing-key" value="routeKey_TradePayNotify_delay_15s"/>
	    </rabbit:queue-arguments>
    </rabbit:queue>
	
	<!-- 监听处理器 -->
	<bean id="tradePayNotifyListener" class="test.prj.main.rabbit.TradePayNotifyListener" />
	
	<!-- 监听器acknowledge=manual表示手工确认消息已处理(异常时可以不确认消息),auto表示自动确认(只要不抛出异常,消息就会被消费) -->
	<rabbit:listener-container connection-factory="connectionFactory" acknowledge="manual">
		<rabbit:listener queues="queue_TestNotify" ref="tradePayNotifyListener" method="onMessage"/>
	</rabbit:listener-container>
	
	
	<!-- ################ 延迟队列生产者配置 ################ -->
	<rabbit:admin connection-factory="connectionFactory" />
    <bean id="jsonMessageConverter" class="org.springframework.amqp.support.converter.Jackson2JsonMessageConverter" />
    <rabbit:template id="rabbitTemplate" connection-factory="connectionFactory" exchange="trade_direct" message-converter="jsonMessageConverter"/>
    
    <rabbit:queue id="queue_TestNotify_delay_15s" name="queue_TestNotify_delay_15s" durable="true" auto-delete="false" exclusive="false">
    	<rabbit:queue-arguments>
            <entry key="x-message-ttl" value="15000" value-type="java.lang.Long"/>
            <entry key="x-dead-letter-exchange" value="trade_direct"/>
            <entry key="x-dead-letter-routing-key" value="routeKey_TradePayNotify"/>
        </rabbit:queue-arguments>
    </rabbit:queue>
   
    <!-- work exchange -->
	<rabbit:direct-exchange name="trade_direct" durable="true" auto-delete="false">
		<rabbit:bindings>
		    <rabbit:binding queue="queue_TestNotify" key="routeKey_TradePayNotify"/>
		    <rabbit:binding queue="queue_TestNotify_delay_15s" key="routeKey_TradePayNotify_delay_15s"/>
		</rabbit:bindings>
	</rabbit:direct-exchange>


注意不同项目中(或者多个生产者如果都创建同一个exchange,queue时,queue,exchange相关配置应该是一样的),否则会报如下错误:

inequivalent arg 'x-dead-letter-routing-key' for queue

可以先把相关的exchange,queue删除,再重新运行程序即可。


问题:这种方式似乎无法实现像支付宝通知那样的,比如:30s通知一次,60s再通知一次,120s再通知一次,等等。

解决:queue_TestNotify 这个队列的配置,去掉x-dead相关配置,使用程序来分发到不同的queue中,例如queue_15s,queue_30s,queue_60s等等队列。这些所有的队列有dlx都指向queue_TestNotify

RabbitMQ 实现延迟队列的两种方式 定时任务各种各样,常见的定时任务例如日志备份,我们可能在每天凌晨 3 点去备份,这种固定时间的定时任务我们一般采用 cron 表达式就能轻松的实现,还有一些比较特殊的定时任务,向大家看电影中的定时炸弹,3分钟后爆炸,这种定时任务就不太好用 cron 去描述,因为开始时间不确定,我们开发中有的时候也会遇到类似的需求,例如: 在电商项目中,当我们下单之后,一般需要 20 分钟之内或者 30 分钟之内付款,否则订单就会进入异常处理逻辑中,被取消,那么进入到异常处理逻辑中,就可以当成是一个延迟队列。 我买了一个 阅读详情

相关推荐

基于Transformer的CFD代理模型:AeroTransformer原理、实现与优化

计算流体动力学(CFD)仿真是航空航天、汽车工程等领域的关键技术,但其高计算成本限制了设计优化效率。代理模型通过机器学习方法学习输入参数与流场输出间的映射关系,能实现秒级预测,大幅加速仿真流程。Transformer架构凭借其全局注意力机制,能有效建模流场中的长程物理关联,克服了传统卷积神经网络在捕捉全局依赖上的局限。通过预训练与微调策略,模型能先在大规模多样化数据集上学习通用流体规律,再针对特定任务快速适配,显著提升了小样本下的泛化能力与工程实用价值。AeroTransformer项目正是这一技术路线的典

weixin_33509203的博客 358

死信队列小结

死信队列

飞鸟的心情 1983

在虚拟机上搭建FTP服务器

chroot_list_file=/etc/vsftpd/chroot_list # 对chroot_list下用户限制。[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf #打开配置文件。# 指定用户的shell: -s /usr/bin/nologin。# 在配置文件中找到以下几行代码, 去掉注释(去掉 "#"号)# 指定用户主目录:/data/ftp/ftpuser -M。(2)修改配置文件,路径/etc/vsftpd/ 下的文件。

weixin_70753380的博客 3209

延时队列 producer 所遇到的问题:

package producer import ( "SeckillDesign/constant" "SeckillDesign/utitl" "fmt" "github.com/streadway/amqp" ) func DelayProducer(message string){ //TODO 他这个不需要你传入什么 直接生成一个链接 //就是获取这个连接呀 conn:=utitl.NewRabbitMQ().Conn defer conn.

qqqweiweiqq的博客 1430

RealSense D435i深度相机实战:从像素坐标到三维空间的精准映射(Python实现)

本文详细介绍了使用RealSense D435i深度相机实现从二维像素坐标到三维空间坐标精准映射的两种Python实战方法:深度图反投影法与点云直接查找法。文章涵盖环境搭建、相机对齐、代码实现、性能对比及与YOLO等检测模型结合的进阶应用,并提供了关键的避坑指南和参数调优建议,帮助开发者在机器人、三维重建等项目中高效应用。

weixin_29291573的博客 382

STM32CubeMX+FreeRTOS实战:3步搞定LED任务配置(附代码解析)

本文详细解析了如何使用STM32CubeMX图形化工具配置FreeRTOS实时操作系统,并创建LED闪烁任务。通过剖析MX_FREERTOS_Init()函数和CMSIS-RTOS封装层,深入理解任务创建、调度及osDelay()协作机制,帮助开发者从点击生成进阶到内核原理掌握,实现高效的多任务嵌入式开发。

weixin_29192141的博客 468

RabbitMQ死信队列

DLX,全称为Dead-Letter-Exchange , 可以称之为死信交换机,也有人称之为死信邮箱。当消息在一个队列中变成死信(dead message)之后,它能被重新发送到另一个交换机中,这个交换机就是DLX ,绑定DLX的队列就称之为死信队列。消息被拒绝消息过期队列达到最大长度DLX也是一个正常的交换机,和一般的交换机没有区别,它能在任何的队列上被指定,实际上就是设置某一个队列的属性。

weixin_59074080的博客 9509

基于Dify1.9知识库流水线模板的思考——图像和表格数据处理

本文探讨了Dify1.9知识库流水线中LLM节点对文档图像/表格增强处理的优化方案。针对当前仅在内容后追加说明的简单做法,提出了结构化标注的改进方法:通过唯一ID和注释块标记图像/表格及其描述,确保内容可精准对齐。文章详细阐述了该方案的解析处理流程、数据结构化表示方法,以及在RAG检索和文档还原中的具体应用。关键经验包括:必须结构化标注非文本内容、LLM增强的必要性、语义向量化处理等。该方案解决了原始方法在内容重排、相似元素区分和检索精度等方面的问题。

roseey的专栏 1436

RabbitMQ - 死信队列,延时队列

而在第二种方法中,即使消息过期,也不会马上从队列中抹去,因为每条消息是否过期是在即将投递到消费者之前判定的。参数,那么它会被发送到x-dead-letter-exchange对应值的交换器上,这个交换器就称之为死信交换器,与这个死信交换器绑定的队列就是死信队列。DLX 全称(Dead-Letter-Exchange),称之为死信交换器,当消息变成一个死信之后,如果这个消息所在的队列存在。消费者二监听的死信队列收到消息。进入死信队列之后,headers 加了一些死信相关的信息,包括原队列以及进入死信的原因。

MinggeQingchun的博客 4140

DLMS/COSEM协议的理解体会

DLMS是通信协议,COSEM是电表建模规范。HDLC帧基本格式为0x7e......

一个bug是bug,多个bug能work 8312

基于Python的电商平台商品价格监控与历史价格查询系统

随着电子商务的快速发展,消费者对商品价格透明度的需求日益增长。本文设计并实现了一个基于Python的电商平台商品价格监控与历史价格查询系统,能够自动抓取京东和淘宝商品信息,存储历史价格数据,并通过可视化界面展示价格走势。系统采用最新的异步爬虫技术、反爬虫绕过策略和现代Web框架,实现了高效稳定的数据采集与展示功能。关键词:Python爬虫、价格监控、历史价格、数据可视化、异步爬虫、电商平台实现了京东和淘宝商品信息的异步爬取,采用多种反爬虫策略提高爬取成功率;

2201_76125261的博客 682

RabbitMq的学习(三):Java使用Exchange(路由)

RabbitMq的Exchange(路由)官方文档:http://www.rabbitmq.com/getstarted.html(语言记得选Java) 路由概要说明:一个Exchange(路由)可以绑定多个Queue(队列), 根据不同的Exchange类型可以实现不同Exchange策略。   一、fanout 说明:把所有发送到该Exchange的消息路由到所有与它绑定的Queue...

LemonCake的博客 2173

点云最小二乘法拟合曲线

文章目录一、引言 一、引言

dayuhaitang1的博客 2734

【SpringBoot】SpringBoot整合RabbitMQ消息中间件,实现延迟队列和死信队列

RabbitMQ的死信队列(Dead Letter Queue,DLQ)是一种特殊的队列,用于接收其他队列中的“死信”消息。所谓“死信”,是指满足一定条件而无法被消费者正确处理的消息,这些条件包括消息被拒绝、消息过期、消息达到最大重试次数等。当消息成为死信时,RabbitMQ会将其重新发送到指定的死信队列,而不是丢弃它们。这样做的好处是可以对死信进行分析和处理,例如记录日志、重新入队或者进一步处理。

qq_61024956的博客 9840

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SpringBoot实现RabbitMQ延迟队列

RabbitMQ 延迟消息队列是一种可以把消息存储在队列中,但是只有在达到特定的等待时间之后才能被消费的机制。这种机制可以用于处理各种需要延迟处理的任务,例如发送邮件、推送消息等。

此人很懒,什么都没有写~~ 1612

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Spring Boot(十四)RabbitMQ延迟队列

到此为止我们已经使用“rabbitmq-delayed-message-exchange”插件实现了延迟功能,但是需要注意的一点是,如果使用命令“rabbitmq-plugins disable rabbitmq_delayed_message_exchange”禁用了延迟插件,那么所有未发送的延迟消息都将丢失。

2501_92669908的博客 934

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Spring Boot RabbitMq之延迟队列

一、何谓延迟队列? 顾名思义,延迟队列就是进入该队列的消息会被延迟消费的队列。而普通的队列,消息一旦进入队列就会被消费者立即消费。有些同学可能会思考,那延迟队列可以用来干什么,为什么要使用延迟队列以及该如何使用?接下来,笔者将会为同学们一一介绍,然后带领同学们一起进行实战演练。 二、延迟队列的应用场景 延迟队列的应用场景有很多,以下列举了最常用的几种: 用户生成订单30分钟之后,如果还未支付订单...

zh19940106的博客 488

如何使用Spring Boot与RabbitMQ结合实现延迟队列

背景 何为延迟队列? 顾名思义,延迟队列就是进入该队列的消息会被延迟消费的队列。而一般的队列,消息一旦入队了之后就会被消费者马上消费。 延迟队列能做什么?延迟队列多用于需要延迟工作的场景。最常见的是以下两种场景: 延迟消费。比如: 用户生成订单之后,需要过一段时间校验订单的支付状态,如果订单仍未支付则需要及时地关闭订单。 用户注册成功之后,需要过一段时间比如一周后校验用户的使用情况...

qq_41143507的博客 1500

RabbitMQ教程(三)| SpringBoot集成RabbitMq(死信队列、延迟队列)

SpringBoot集成RabbitMq(死信队列、延迟队列)

qq_20236937的博客 2068

RabbitMQ 高级特性之延迟队列

摘要:本文介绍了RabbitMQ实现延迟消息的两种方式。第一种是TTL+死信队列方案,通过设置消息过期时间并转发到死信队列实现延迟消费,但存在消息阻塞问题(后到期的消息可能先被消费)。第二种是使用RabbitMQ官方延迟消息插件,直接创建延迟交换机,能精确控制每条消息的延迟时间,解决了第一种方案的缺陷。文中详细展示了两种方案的代码实现,包括队列配置、生产者发送延迟消息的方法以及消费者监听逻辑,并对比了两种方案的实际运行效果差异。插件方案虽然需要额外安装配置,但提供了更可靠的延迟消息处理能力。

2301_79184547的博客 1431

Spring Boot 项目中整合 RabbitMQ,使用死信队列(Dead Letter Exchange, DLX)实现延迟队列功能

配置 RabbitMQ:在文件中配置 RabbitMQ 的连接信息。创建 RabbitMQ 配置类:定义交换机、队列和绑定关系,设置死信交换机。发送延迟消息:通过发送带有 TTL 的消息。消费延迟消息:通过注解消费死信队列中的消息。通过这种方式,可以在 Spring Boot 项目中使用死信队列实现延迟队列功能。需要注意的是,消息的 TTL 是以毫秒为单位的,且消息的延迟时间不能超过 RabbitMQ 的最大消息大小限制。

qq_43197840的博客 1106

Java 中间件:RabbitMQ 延迟队列(死信交换机实现)

本文介绍了如何利用RabbitMQ的死信交换机机制实现延迟队列功能。主要内容包括: 延迟队列的概念及应用场景,如订单超时处理、消息重试等 RabbitMQ通过TTL和死信交换机组合实现延迟队列的原理 关键概念解析:TTL、死信、死信交换机和路由键 实现流程:消息先进入延迟队列,TTL到期后转为死信并路由到业务队列 环境准备和Spring Boot项目搭建指南 核心组件定义:延迟交换机、延迟队列、死信交换机和业务队列 文章通过清晰的流程图和代码示例,展示了如何从零开始构建一个基于RabbitMQ的延迟队列系统

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

RabbitMQ核心概念与Spring Boot集成实践指南

消息队列作为分布式系统的重要组件,通过异步通信机制实现服务解耦和流量削峰。RabbitMQ作为AMQP协议的标准实现,凭借其可靠的消息传递、灵活的路由策略和跨平台特性,成为企业级应用的首选消息中间件。本文从消息队列基础原理出发,深入解析RabbitMQ的Exchange路由机制、消息确认等核心功能,并结合Spring Boot框架展示生产环境中的最佳实践方案,包括集群部署、延迟队列实现等典型应用场景。针对电商、金融等行业常见的高并发挑战,特别分享消息堆积处理、连接稳定性保障等性能优化技巧。

cong84596496的博客 412

rabbitMq实现延迟队列

消息可靠发送、消息可靠投递、死信队列来保障消息至少被消费一次以及未被正确处理的消息不会被丢弃。另外,通过RabbitMQ集群的特性,可以很好的解决单点故障问题,不会因为单个节点挂掉导致延时队列不可用或者消息丢失。当然,延时队列还有很多其它选择,比如利用Java的DelayQueu,利用Redis的zset,利用Quartz或者利用kafka的时间轮,这些方式各有特点。自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

2401_84091544的博客 757

RabbitMQ------延迟队列(整合SpringBoot以及使用延迟插件实现真正延时)(七)

延迟队列,内部是有序的,特点:延时属性。简单讲:延时队列是用来存放需要在指定时间被处理的元素队列。是基于死信队列的消息过期场景。

cz_chen_zhuo的博客 1411

RabbitMQ 延迟队列,消息延迟推送

发送消息时我们需要指定延迟推送的时间,我们这里在发送消息的方法中传入参数 new MessagePostProcessor() 是为了获得 Message对象,因为需要借助 Message对象的api 来设置延迟时间。我们在 Exchange 的声明中可以设置exchange.setDelayed(true)来开启延迟队列,也可以设置为以下内容传入交换机声明的方法中,因为第一种方式的底层就是通过这种方式来实现的。使用传统的数据库轮询来判断数据库表中订单的状态,这无疑增加了IO次数,性能极低。

2401_85764651的博客 963
上一篇: postfix别名转发的设置
下一篇: Rabbitmq延迟队列(两个exchange,多个队列)
踏雪听雨
博客等级 码龄22年 72粉丝 178原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值