20.rabbitmq插件实现延迟队列

问题

前面谈到基于死信的延迟队列,存在的问题:如果第一个消息延时时间很长,而第二个消息延时时间很短,第二个消息并不会优先得到执行。

下载插件

地址:https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases

rabbitmq_delayed_message_exchange-3.8.0.ez

说明:rabbitmq安装后,会生成这个目录

/usr/lib/rabbitmq/lib/rabbitmq_server-3.8.8/plugins/

拷贝插件到上面这个目录

安装插件

需要重启rabbitmq

监测插件是否安装成功

可以看出不再使用延迟队列,而是使用延迟交换机。

代码

配置代码

package com.xkj.org.config;import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.CustomExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.HashMap;
import java.util.Map;@Configuration
public class DelayExchangeConfig {//队列public static final String DELAYED_QUEUE_NAME = "delayed.queue";//交换机public static final String DELAYED_EXCHANGE_NAME = "delayed.exchange";//RoutingKeypublic static final String DELYAED_ROUTING_KEY = "delayed.routingkey";@Beanpublic CustomExchange delayedExchange() {Map<String, Object> arguments = new HashMap<>();arguments.put("x-delayed-type", "direct");//第一个参数交换机的名称//第二个参数交换机的类型//第三个参数是否持久化//第四个参数是否删除//第五个参数其他参数return new CustomExchange(DELAYED_EXCHANGE_NAME, "x-delayed-message", true, false,arguments);}@Beanpublic Queue delayedQueue() {return new Queue(DELAYED_QUEUE_NAME);}@Beanpublic Binding delayedQueueBindingDelayedExchange(@Qualifier("delayedExchange")CustomExchange delayedExchange,@Qualifier("delayedQueue")Queue delayedQueue) {return BindingBuilder.bind(delayedQueue).to(delayedExchange).with(DELYAED_ROUTING_KEY).noargs();}}

生产者

@ApiOperation("基于插件的延迟消息")@GetMapping("/sendDelayedMsg/{msg}/{delayedTime}")public void sendDelayedMsg(@ApiParam(value = "消息内容", required = true)@PathVariable("msg") String message,@ApiParam(value = "延迟时间", required = true)@PathVariable("delayedTime")Integer delayedTime) {log.info("当前时间{},发送一条消息给延迟交换机:{},delayedTime={}", new Date().toString(), message, delayedTime);rabbitTemplate.convertAndSend("delayed.exchange", "delayed.routingkey", message, msg -> {msg.getMessageProperties().setDelay(delayedTime);return msg;});}

消费者

package com.xkj.org.listener;import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;import java.io.UnsupportedEncodingException;
import java.util.Date;/*** 基于插件的延迟消息队列监听*/
@Slf4j
@Component
public class DelayedQueueConsumer {@RabbitListener(queues = "delayed.queue")public void receiver(Message message, Channel channel) throws UnsupportedEncodingException {String msg = new String(message.getBody(), "UTF-8");log.info("当前时间:{},收到延迟队列的消息:{}", new Date().toString(), msg);}}

 总结

延迟队列可以保证消息可靠发送,消息可靠投递,死信队列保证消息至少被消费一次,已经未被处理的消息不会被丢弃。

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

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

相关文章

49.TFT_LCD液晶屏驱动设计与验证(2)

&#xff08;1&#xff09;Visio视图&#xff1a; &#xff08;2&#xff09;控制模块Verilog代码&#xff1a; module tft_ctrl(input clk_33M ,input reset_n ,input [23:0] data_in ,output [9:0] hang…

Cortex-M内核M0,M0+,M3,M4,M7之间的区别

之所以ARM公司会把Cortex-M分为这么多系列&#xff0c;主要是针对不同的应用领域&#xff1b;下面详细介绍&#xff1a; Cortex-M分为&#xff1a;M0&#xff0c;M0&#xff0c;M3&#xff0c;M4&#xff0c;M7 M0&#xff0c;M0&#xff1a;基础版本&#xff0c;从图中可以看…

Centos部署PHP

环境&#xff1a;Centos7 安装PHP步骤&#xff1a; 一&#xff1a;安装依赖 yum install epel-release -yyum install gcc openssl-devel libxml2-devel bzip2-devel libmcrypt-devel sqlite-devel oniguruma-devel -y 二&#xff1a;下载php源码⽂件 cd /usr/local/srcwge…

PLSQL Developer工具查询数据,报错(动态性能表不可访问)

解决的问题&#xff1a; 解决方案&#xff1a; 在配置-首选项-选项&#xff0c;取消勾选“自动统计”&#xff0c;保存之后即可查询数据

WSL快速入门

1. WSL介绍 WSL文档地址&#xff1a;https://learn.microsoft.com/zh-cn/windows/wsl WSL&#xff1a;全称 Windows Subsystem for Linux&#xff0c;即windows上的Linux子系统&#xff08;虚拟机工具&#xff09;。是Win10推出的全新特性&#xff0c;可以更轻量地在Windows系统…

【网络安全】子域名模糊测试实现RCE

未经许可&#xff0c;不得转载。 文章目录 正文总结 正文 在之前测试一个私人项目时&#xff0c;我报告了admin.Target.com上的Auth Bypass漏洞&#xff0c;这将导致SQLI&RCE &#xff0c;该漏洞在报告后仅一天就被修复。 现在重拾该应用程序&#xff0c;对子域进行模糊测…

Java整理18

1、AOP AOP概念&#xff1a;通过预编译方式和运行期动态代理方式实现&#xff0c;在不修改源代码的情况下给程序动态统一添加额外功能的一种技术。 动态代理分类:JDK动态代理&#xff1a;有接口代理对象和目标对象实现同样的接口cglib动态代理&#xff1a;无接口继承被代理的目…

Symfony 表单构建器:创建和管理表单的最佳实践

Symfony 表单构建器&#xff1a;创建和管理表单的最佳实践 Symfony 是一个流行的 PHP 框架&#xff0c;以其强大的功能和灵活性闻名。表单构建器是 Symfony 中一个非常重要的组件&#xff0c;它提供了简单且高效的方式来创建和管理表单。本文将详细介绍 Symfony 表单构建器的最…

利用jdk自带keytool工具生成jks签名文件注意事项

如题&#xff0c;用三个不同版本jdk生成jks文件&#xff0c;并配置到Android Studio里面验证&#xff0c;结果如下&#xff1a; jdk1.8&#xff1a;正常 jdk11、jdk17&#xff1a;出错&#xff0c;错误日志如下 FAILURE: Build completed with 2 failures.1: Task failed with…

RAG技术之Router

Router有什么用&#xff1f; 在RAG应用中&#xff0c;Router可以帮助我们基于用户的查询意图来决定使用何种数据类型或数据源&#xff0c;比如是否需要进行语义检索、是否需要进行text2sql查询&#xff0c;是否需要用function call来进行API调用。 Router也可以根据用户的查询…

麦田物语第十五天

系列文章目录 麦田物语第十五天 文章目录 系列文章目录一、构建游戏的时间系统二、时间系统 UI 制作总结 一、构建游戏的时间系统 在该游戏中我们要构建年月日天时分秒等时间的概念&#xff0c;从而实现季节的更替&#xff0c;昼夜的更替等&#xff08;不同的季节可以播种不同…

qt总结--翻金币案例

完成了一个小项目的在qt5.15.2环境下的运行,并使用NSIS editNSIS打包完成.有待改进之处:增加计时功能,随机且能通关功能,过关后选择下一关功能.打包后仅仅有安装包有图标 安装后应用图标并未改变 在qt .pro中有待改进对qt的基本操作和帮助文档有了基本的认识.对C制作小游戏有了…

YOLO5项目目录最强解析

YOLO5项目目录解析 YOLOv5 项目目录下的文件和目录的结构&#xff0c;以下是对每个目录和文件的解释&#xff1a; 目录 &#x1f4c1; .github: 存放 GitHub 相关配置和文件&#xff0c;如 GitHub Actions 工作流文件、Issue 模板等&#xff0c;用于自动化构建和持续集成等功…

MYSQL 第五次作业

一、第五次作业 二、建立触发器 在订单表中增加订单数量后&#xff0c;商品表的商品数量同步减少对应的商品订单出数量&#xff1b;客户取消订单时恢复商品表对应商品的数量&#xff1b;当客户修改订单时&#xff0c;商品表对应商品的数量同步更新。 3、存储 DELIMITER $$ CREA…

USB 2.0 协议专栏之 USB 2.0 连接与枚举(二)

前言&#xff1a;本篇博客为手把手教学的 USB 2.0 协议栈类精品博客&#xff0c;该专栏博客侧重针对 USB 2.0 协议进行讲解。本篇博客将针对 USB 2.0 中的连接与枚举进行教学&#xff0c;USB 的枚举过程是 USB 协议中至关重要的一环&#xff0c;也是嵌入式工程师必须掌握的内容…

Python层内层外多图布局图基分析

&#x1f3af;要点 &#x1f3af;多层图和多路复用图结构模型 | &#x1f3af;图结构变换、读写图、聚类系数、可视化、同构、图基分析 | &#x1f3af;稀疏网络边数和节点数线性扩展 | &#x1f3af;耦合边的生成和惰性评估 | &#x1f3af;层内布局计算、多层网络绘图、层间…

世界的三大财团都是谁在控制?

在美国的华尔街有三巨头&#xff0c;他们是世界的三大财团&#xff0c;管理着将近22万亿美元的财富。这个数字是个什么概念呢&#xff0c;我们打个比方&#xff0c;欧盟27国再加上日本一年的GDP也不过才刚刚好20万亿美元。这三大财团分别是&#xff1a;第一是贝莱德管理着10万亿…

基于深度学习网络的USB摄像头实时视频采集与水果识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 将usb摄像头对准一个播放不同水果图片的显示器&#xff0c;然后进行识别&#xff0c;识别结果如下&#xff1a; 本课题中…

智能火灾预警系统:基于深度学习的火焰与烟雾检测平台

基于深度学习的火焰与烟雾检测系统&#xff08;UI界面YOLOv8/v7/v6/v5代码训练数据集&#xff09; 引言 火灾是对人类生命和财产安全的严重威胁&#xff0c;及时检测和报警是减少火灾损失的关键。传统的火焰和烟雾检测方法主要依靠传感器&#xff0c;但这些方法存在检测范围有…

Vue3--

一、pinia &#xff08;集中式状态&#xff08;数据&#xff09;管理&#xff09; 1、准备一个效果 2、存储读取数据 3、修改数据三种方式 4、storeToRefs 5、getters 当state中的数据&#xff0c;需要经过处理后在使用时&#xff0c;可以使用getters配置 6、$subscribe的使用…