RabbitMq死信队列延迟交换机

架构图

配置

package com.example.demo.config;import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class DeadLetterConfig {public String Nomarl_Exchange = "normal_exchange";public String Normal_Queue = "normal_queue";public String Normal_RoutingKey = "normal.#";public String Dead_Exchange = "dead_exchange";public String Dead_Queue = "dead_queue";public String Dead_RoutingKey = "dead.#";@Beanpublic Exchange normalExchange(){return ExchangeBuilder.topicExchange(Nomarl_Exchange).build();}@Beanpublic Queue normalQueue(){return QueueBuilder.durable(Normal_Queue).deadLetterExchange(Dead_Exchange).deadLetterRoutingKey("dead.sss.a").build();}@Beanpublic Binding bindingNormalKey(Exchange normalExchange,Queue normalQueue){return BindingBuilder.bind(normalQueue).to(normalExchange).with(Normal_RoutingKey).noargs();}@Beanpublic Exchange deadExchange(){return ExchangeBuilder.topicExchange(Dead_Exchange).build();}@Beanpublic Queue deadQueue(){return QueueBuilder.durable(Dead_Queue).build();}@Beanpublic Binding bindingDeadKey(Exchange deadExchange,Queue deadQueue){return BindingBuilder.bind(deadQueue).to(deadExchange).with(Dead_RoutingKey).noargs();}}

1.被消费者拒绝,并且requeue值设置为false

package com.example.demo.consumer;import com.example.demo.config.DeadLetterConfig;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;import java.io.IOException;@Component
public class RejectConsumer {@RabbitListener(queues = DeadLetterConfig.Normal_Queue)public void rejectOrBicNack(String str, Channel channel, Message message) throws IOException {System.out.println("接收到消息"+str);//1.进行channel进行basicNack,记得将requeue设置为false
//        channel.basicNack(message.getMessageProperties().getDeliveryTag(),false,false);//记得在配置文件配置 acknowledge-mode: manual #开启手动ACK
//        channel.basicReject(message.getMessageProperties().getDeliveryTag(),false);channel.basicReject(message.getMessageProperties().getDeliveryTag(),false);//以上方式二选一即可}
}

2.消息过期或者队列存储消息过期

  public void publishExpire(){String msg = "dead dlx test expire";rabbitTemplate.convertAndSend(DeadLetterConfig.Nomarl_Exchange, "normal.211313",msg, new MessagePostProcessor() {@Overridepublic Message postProcessMessage(Message message) throws AmqpException {message.getMessageProperties().setExpiration("5000");//设置过期时间return message;}});}

消息过期

  @Beanpublic Queue normalQueue(){return QueueBuilder.durable(Normal_Queue).deadLetterExchange(Dead_Exchange).deadLetterRoutingKey("dead.sss.a").ttl(10000).build();}

给队列存储消息设置最大时间,超过这个时间,消息将会通过设置的这个routingkey从死信交换机转发给对应的死信队列。

3.队列消息达到最大长度 

   @Beanpublic Queue normalQueue(){return QueueBuilder.durable(Normal_Queue).deadLetterExchange(Dead_Exchange).deadLetterRoutingKey("dead.sss.a")//.ttl(10000).maxLength(1).build();}

通过maxLength属性设置最大数量,这里设置属性最大为1

4.设置延迟交换机

延迟交换机下载地址

package com.example.demo.config;import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.HashMap;
import java.util.Map;@Configuration
public class DelayedConfig {public static final String Delayed_Exchange = "delayed_exchange";public static final String Delayed_Queue = "delayed_queue";public static final String Delayed_RoutingKey = "delayed_routingLey";@Beanpublic Exchange buildDealayedExchange(){Map<String,Object>arguments =new HashMap<>();arguments.put("x-delayed-type","topic");String type = "x-delayed-type";Exchange exchange =new CustomExchange(Delayed_Exchange,type,true,false,arguments);return exchange;}@Beanpublic Queue buildDealyedQueue(){return QueueBuilder.durable(Delayed_Queue).build();}@Beanpublic Binding bindingDelayed(Exchange buildDealayedExchange,Queue buildDealyedQueue){return BindingBuilder.bind(buildDealyedQueue).to(buildDealayedExchange).with(Delayed_RoutingKey).noargs();}
}

这样设置之后,发送的消息会在交换机中待够设置的过期时间后才会到相应的队列。

如果消息过期时间一致,可以只不设置延迟交换机,当过期时间类型过多的时候,就可以通过设置延迟交换机来满足不同过期时间的类型。 

注意,这里有个参数,arguments 类型为Map<String,Object> 注意要在这个参数里面设置交换机类型,并且放入CustomExchange的构造函数中,不然交换机会创建失败。

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

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

相关文章

学生信息管理系统(简化版)数据库部分

使用Mysql&#xff0c;与navicat工具 下面是mysql创建的代码&#xff0c;可做必要修改 -- 创建学生学籍信息表 CREATE TABLE StudentEnrollment (-- 学号&#xff0c;作为主键student_id VARCHAR(8) NOT NULL,-- 学生姓名stu_name VARCHAR(8) NOT NULL,-- 学生性别gender VARC…

新手上路,学Go还是Python

对于新手来说&#xff0c;Go和Python都是很好的编程语言&#xff0c;它们各有特点&#xff0c;以下是详细的对比来帮助你决定先学哪一个&#xff1a; 一、语法和学习难度 Python 语法简洁易懂&#xff1a;Python以其简洁、优雅的语法而闻名&#xff0c;代码的可读性很高。例如…

信号处理:概念、应用、领域、方法

信号处理是一个广泛的领域&#xff0c;涉及对各种类型信号&#xff08;如音频信号、图像信号、生物信号、通信信号等&#xff09;的分析、操作和变换。信号处理的主要目标是获取有用信息、增强信号质量、消除噪声、提取特征以及实现数据 compression等。信号处理可以分为模拟信…

Socket编程-tcp

1. 前言 在tcp套接字编程这里&#xff0c;我们将完成两份代码&#xff0c;一份是基于tcp实现普通的对话&#xff0c;另一份加上业务&#xff0c;client输入要执行的命令&#xff0c;server将执行结果返回给client 2. tcp_echo_server 与udp类似&#xff0c;前两步&#xff1…

go语言的sdk项目搭建与git 操作标签tag并推送至远程仓库

在搭建 SDK 项目并结合 Git 操作标签&#xff08;Tag&#xff09;时&#xff0c;通常会涉及项目初始化、版本管理、Git 标签的创建与管理等内容。以下是一个完整的步骤指南&#xff0c;帮助您搭建 SDK 项目并学习如何使用 Git 标签。 ### 1. **搭建 SDK 项目** 首先&#xff…

Android13 USB 串口默认授权

一&#xff09;场景需求 项目中使用到了can协议控制车机功能&#xff0c;can 直接转串口&#xff0c;用USB转串口工具 cn.wch.uartlib 来实现. can 板子通过usb 插入到机器上面&#xff0c;那就是usb 协议了。 遇到问题&#xff1a; 插入can 板的usb 到机器上后&#xff0c;直…

【数据库】E-R模型、函数依赖、范式

2. 东方货运公司数据库的样本数据如下。 表名称&#xff1a;卡车 车号 货运站编号 类型 总行程 购入日期 1001 501 1 59002.7 11/06/2000 1002 502 2 54523.8 11/08/2000 1003 501 2 32116.6 09/29/2001 1004 502 2 3256.9 …

保姆级教学 uniapp绘制二维码海报并保存至相册,真机正常展示图片二维码

一、获取二维码 uni.request({url: https://api.weixin.qq.com/wxa/getwxacode?access_token${getStorage("token")},responseType: "arraybuffer",method: "POST",data: {path: "/pages/index/index"},success(res) {// 转换为 Uint…

JAVA安全—SpringBoot框架MyBatis注入Thymeleaf模板注入

前言 之前我们讲了JAVA的一些组件安全&#xff0c;比如Log4j&#xff0c;fastjson。今天讲一下框架安全&#xff0c;就是这个也是比较常见的SpringBoot框架。 SpringBoot框架 Spring Boot是由Pivotal团队提供的一套开源框架&#xff0c;可以简化spring应用的创建及部署。它提…

【数据结构】动态规划-基础篇

针对动态规划问题&#xff0c;我总结了以下5步&#xff1a; 确定dp数组以及下标的含义&#xff1b; 递推公式&#xff1b; dp数组如何初始化&#xff1b; 遍历顺序&#xff1b; 打印dp数组&#xff08;用来debug&#xff09;&#xff1b; 以上5步适用于任何动态规划问题&#x…

十一、容器化 vs 虚拟化-Docker 使用

文章目录 前言一、Docker Hello World二、Docker 容器使用三、Docker 镜像使用四、Docker 容器连接五、Docker 仓库管理六、Docker Dockerfile七、Docker Compose八、Docker Machine九、Swarm 集群管理 前言 Docker 使用‌ Docker 容器使用、镜像使用、容器连接、仓库管理、Do…

Java-22 深入浅出 MyBatis - 手写ORM框架3 手写SqlSession、Executor 工作原理

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

EasyPlayer.js播放器如何在iOS上实现低延时直播?

随着流媒体技术的迅速发展&#xff0c;H5流媒体播放器已成为现代网络视频播放的重要工具。其中&#xff0c;EasyPlayer.js播放器作为一款功能强大的H5播放器&#xff0c;凭借其全面的协议支持、多种解码方式以及跨平台兼容性&#xff0c;赢得了广泛的关注和应用。 那么要在iOS上…

OpenAI深夜官宣!为期十二天的圣诞惊喜活动发布AI模型大招!Sora、满血o1和高级语音或将发布

OpenAI深夜官宣&#xff01;为期十二天的圣诞惊喜活动发布AI模型大招&#xff01;Sora、满血o1和高级语音或将发布 大家好&#xff0c;我是猫头虎&#x1f63a;&#xff0c;今天我们来聊聊最近科技圈的大新闻——OpenAI 深夜官宣的圣诞惊喜活动&#xff01;这次 OpenAI 的动作…

【JAVA高级篇教学】第二篇:使用 Redisson 实现高效限流机制

在高并发系统中&#xff0c;限流是一项非常重要的技术手段&#xff0c;用于保护后端服务&#xff0c;防止因流量过大导致系统崩溃。本文将详细介绍如何使用 Redisson 提供的 RRateLimiter 实现分布式限流&#xff0c;以及其原理、使用场景和完整代码示例。 目录 一、什么是限流…

leetcode_547 省份数量

该题主要运用了图的连通性 接着使用染色法解决该问题 染色法:标记所有节点为false 访问后 将其标记位true class Solution {int n; // 代表n个数据bool colors[201]; // 标记是否访问到void dfs(vector<vector<int>>& isConnected, int u) { // …

多系统对接的实现方案技术分析

前言 随着信息化和大数据时代的到来&#xff0c;数据资产变得至关重要&#xff0c;企业纷纷上线多种软件系统和移动端应用以适应这一变化。这些系统和应用虽然发挥了各自的优势&#xff0c;但也导致了信息孤岛问题。为了解决这一问题&#xff0c;数据中台和异构系统集成技术应…

基于SpringBoot的“滴答拍摄影项目”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“滴答拍摄影项目”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 滴答拍摄影项目结构图 管理员登录首页界面图 用…

攻防世界安卓刷题笔记(新手模式)1-4

1.基础android 进入后是这样的页面。查看源代码看看。首先要注意这个软件并没有加壳&#xff0c;所以我们可以直接着手分析。搜索错误提示“Failed”定位到关键代码&#xff0c;看样子就是检验输入的内容 注意到这里有一行关键代码&#xff0c;cond_39对应的正是failed那个地方…

PHP保存base64编码图片,图片有一部分是灰色块儿,原因和解决办法

文章目录 场景原因解决方案完整的代码前端代码php代码 场景 我有个需求&#xff0c;移动端h5上传多张的图片。用input file可以上传多张&#xff0c;但是现在照片体积越来越大&#xff0c;同时上传多张会因为体积过大&#xff0c;导致上传失败。如果是小程序会好很多&#xff…