springboot整合rabbitmq死信队列

news2024/9/24 15:16:21

springboot整合rabbitmq死信队列

什么是死信

说道死信,可能大部分观众大姥爷会有懵逼的想法,什么是死信?

死信队列,俗称DLX,翻译过来的名称为Dead Letter Exchange 死信交换机。

当消息限定时间内未被消费,成为 Dead Message后,可以被重新发送到另一个交换机中,发挥其应有的价值!

需要测试死信队列,则需要先梳理整体的思路,如可以采取如下方式进行配置:

从上面的逻辑图中,可以发现大致的思路:
在这里插入图片描述

.1. 消息队列分为正常交换机、正常消息队列;以及死信交换机和死信队列。
2. 正常队列针对死信信息,需要将数据 重新 发送至死信交换机中。

死信使用的场景

  1. 消息被拒绝
  2. 消息ttl过期
  3. 队列达到最大长度

这三种场景就会成为死信,然后放入死信交换机

import org.springframework.amqp.core.\*;
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 RabbitmqConfig {

    //正常交换机的名字
    public final static String  EXCHANGE\_NAME = "exchange\_name";
    //正常队列的名字
    public final static String QUEUE\_NAME="queue\_name";
    //死信交换机的名字
    public final static String  EXCHANGE\_DEAD = "exchange\_dead";
    //死信队列的名字
    public final static String QUEUE\_DEAD="queue\_dead";
    //死信路由key
    public final static String DEAD\_KEY="dead.key";




    //创建正常交换机
    @Bean(EXCHANGE\_NAME)
    public Exchange exchange(){
        return ExchangeBuilder.topicExchange(EXCHANGE\_NAME)
                //持久化 mq重启后数据还在
                .durable(true)
                .build();
    }



    //创建正常队列
    @Bean(QUEUE\_NAME)
    public Queue queue(){
        //正常队列和死信进行绑定 转发到 死信队列,配置参数
        Map<String,Object>map=getMap();
        return new Queue(QUEUE\_NAME,true,false,false,map);
    }

    //正常队列绑定正常交换机 设置规则 执行绑定 定义路由规则 requestmaping映射
    @Bean
    public Binding binding(@Qualifier(QUEUE\_NAME) Queue queue,
                           @Qualifier(EXCHANGE\_NAME) Exchange exchange){
        return BindingBuilder.bind(queue)
                .to(exchange)
                //路由规则
                .with("app.#")
                .noargs();
    }

    //创建死信队列
    @Bean(QUEUE\_DEAD)
    public Queue queueDead(){
        return new Queue(QUEUE\_DEAD,true,false,false);
    }

    //创建死信交换机
    @Bean(EXCHANGE\_DEAD)
    public Exchange exchangeDead(){
        return ExchangeBuilder.topicExchange(EXCHANGE\_DEAD)
                .durable(true) //持久化 mq重启后数据还在
                .build();
    }


    //绑定死信队列和死信交换机
    @Bean
    public Binding deadBinding(){
        return BindingBuilder.bind(queueDead())
                .to(exchangeDead())
                //路由规则 正常路由key
                .with(DEAD\_KEY)
                .noargs();
    }

    /\*\*
      获取死信的配置信息
     \*
     \*\*/
    public Map<String,Object>getMap(){
        //3种方式 任选其一,选择其他方式之前,先把交换机和队列删除了,在启动项目,否则报错。
        //方式一
        Map<String,Object> map=new HashMap<>(16);
        //死信交换器名称,过期或被删除(因队列长度超长或因空间超出阈值)的消息可指定发送到该交换器中;
        map.put("x-dead-letter-exchange", EXCHANGE\_DEAD);
        //死信消息路由键,在消息发送到死信交换器时会使用该路由键,如果不设置,则使用消息的原来的路由键值
        map.put("x-dead-letter-routing-key", DEAD\_KEY);
        //方式二
        //消息的过期时间,单位:毫秒;达到时间 放入死信队列
        // map.put("x-message-ttl",5000);
        //方式三
        //队列最大长度,超过该最大值,则将从队列头部开始删除消息;放入死信队列一条数据
        // map.put("x-max-length",3);
        return map;
    }


}

配置文件信息

spring:
  rabbitmq:
    host: 192.168.23.135
    port: 5672
    username: admin
    password: admin
    #虚拟主机
    virtual-host: dmg-a
    listener:
      simple:
        #自动ack
        acknowledge-mode: auto
        retry:
          #最大重试次数
          max-attempts: 3
          #开启重试
          enabled: true

引入 rabbitmq 依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

生产者

@RestController
@RequestMapping("p")
public class TestController {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @GetMapping("/test")
    public String test(){
        //正常交换机 正常路由键 正常消息内容
        rabbitTemplate.convertAndSend(RabbitmqConfig.EXCHANGE\_NAME
        ,"app.test","我是生产者");
        return "aa";
    }
}

//消费者

@Component
public class Xf {


    //监听正常队列名称
    @RabbitListener(queues = {RabbitmqConfig.QUEUE\_NAME})
    public void normal(String payload, Message message, Channel channel) throws IOException {
        System.out.println("正常消息:"+payload);
        long tag=message.getMessageProperties().getDeliveryTag();
        try{
           // int i=1/0;
            //手动签收
            channel.basicAck(tag,true);
        }catch (RuntimeException runtimeException){
            //出现异常 删除消息 放入死信队列
            channel.basicReject(tag,false);
        }
    }

监听死信队列名称

 @RabbitListener(queues = {RabbitmqConfig.QUEUE\_DEAD})
    public void dead(String payload, Message message, Channel channel) throws IOException {
        System.out.println("死信队列:"+payload);
        //删除消息 放入数据库 人工处理
        long deliveryTag=message.getMessageProperties().getDeliveryTag();
        channel.basicAck(deliveryTag,true);
    }
}

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

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

相关文章

编码过程中需要注意哪些安全问题?

SQL 安全 注入式&#xff08;Inject&#xff09;攻击是一类非常常见的攻击方式&#xff0c;其基本特征是程序允许攻击者将不可信的动态内容注入到程序中&#xff0c;并将其执行&#xff0c;这就可能完全改变最初预计的执行过程&#xff0c;产生恶意效果。下面是几种主要的注入…

为 Python 创建别名

有时您有自己喜欢的 Python 版本&#xff0c;并且不想在新版本到来时放弃它。 您的旧脚本可能无法在新版本的 Python 上运行&#xff0c;或者旧版本上的项目太多&#xff0c;将它们迁移到新版本是一场马拉松。 在这种情况下&#xff0c;您决定保留两个版本的 Python。 在本文中…

什么是算法?

目录 算法是指解决方案的准确而完整的描述。 1.算法的基本特征 所谓算法&#xff0c;是一组严谨地定义运算顺序的规则 并且每一个规则都是有效的&#xff0c;且是明确的 此顺序将在有限的次数下终止 什么是算法&#xff1f; 算法的4个基本特征 算法的6个基本方法 选择算…

浏览器输入一个URL之后发生了什么?

URL解析DNS解析TCP连接TSL连接HTTP请求TCP挥手接收并解析响应 URL 解析 主要分为&#xff1a; 协议&#xff0c;eg http,https域名或者ip地址&#xff0c;eg www.baidu.com 域名相对于ip地址来说&#xff0c;更方便人们记忆&#xff0c;但是实际的网络传输中使用的是ip地址 端…

Java“牵手”天猫商品快递费用API接口数据,天猫API接口申请指南

天猫平台商品快递费用接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取天猫商品的标题、价格、库存、商品快递费用&#xff0c;宝贝ID&#xff0c;发货地&#xff0c;区域ID&#xff0c;快递费用&#xff0c;月销量、总销量、库存、详情…

十几款拿来就能用的炫酷表白代码

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 表白代码 1、坐我女朋友好吗&#xff0c;不同意就关机.vbs2、坐我女朋友好吗&…

订单状态定时处理、来单提醒和客户催单

一、Spring Task 1.1 基本介绍 1.2 cron表达式 cron表达式其实就是一个字符串&#xff0c;通过cron表达式可以定义任务触发的时间 构成规则&#xff1a;分为6或7个域&#xff0c;由空格分隔开&#xff0c;每个域代表一个含义 每个域的含义分别为&#xff1a;秒、分钟、小时、日…

C++|观察者模式

观察者模式&#xff1a; 定义对象间的一种一对多&#xff08;变化&#xff09;的依赖关系&#xff0c;以便当一个 对象(Subject)的状态发生改变时&#xff0c;所有依赖于它的对象都 得到通知并自动更新 动机&#xff1a; 在软件构建过程中&#xff0c;我们需要为某些对象建立…

【深度学习 | 核心概念】那些深度学习路上必经的核心概念,确定不来看看?(一)

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

基于吉萨金字塔建造算法优化的BP神经网络(预测应用) - 附代码

基于吉萨金字塔建造算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于吉萨金字塔建造算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.吉萨金字塔建造优化BP神经网络2.1 BP神经网络参数设置2.2 吉萨金字塔建造算法应用…

SpringBoot与前端交互遇到的一些问题

一、XXX.jar中没有主清单属性 场景&#xff1a; SpringBoot打的jar包在Linux运行报错 解决方案&#xff1a; 百度找了很多都是一样的答案&#xff0c;但是解决不了我的问题&#xff0c;于是我新建了一个springboot项目发现打的jar包可以在Linux上运行。检查了下只要把下面这2个…

R语言之缺失值处理

文章和代码已经归档至【Github仓库&#xff1a;https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 R语言 也可获取。 文章目录 缺失值处理1. 识别缺失值2. 探索数据框里的缺失值3. 填充缺失值3.1 删除缺失值&#xff1a;na.omit( )、complete.cases( …

机器学习:异常检测实战

文章目录 Anomaly Detection目录任务介绍数据集方法评估Baseline报告报告评价标准 Anomaly Detection 目录 任务介绍 无监督的异常检测 数据集 方法 autoencode 是否能够还原出原始类型图片&#xff0c;基于重构loss来判断是否正常 重构误差当作异常分数 评估 采用ROC和AUC…

Kubernetes入门 十、HPA 自动扩/缩容

目录 概述安装metrics-server使用HPA 概述 我们已经可以通过手动执行 kubectl scale 命令实现Pod的扩缩容&#xff0c;但是这显然不符合 Kubernetes 的定位目标–自动化和智能化。Kubernetes 期望可以通过监测Pod的使用情况&#xff0c;实现 Pod 数量的自动调整&#xff0c;于…

Orange Pi 3B 开发板 开箱评测 和 系统安装教程

香橙派 Orange Pi 3B&#xff08;RK3566&#xff09;开发板 开箱测评 和 系统烧录教程 简介 香橙派 Orange Pi 3B 是一款树莓派大小的单板计算机&#xff0c;但接口更加齐全&#xff0c;包括一个全尺寸 HDMI 接口和一个 M.2 存储插槽&#xff0c;售价199起。 Orange Pi 3B 采…

【Tkinter系列02/5】界面初步和布局

本文是系列文章第二部分。前文见&#xff1a;【Tkinter系列01/5】界面初步和布局_无水先生的博客-CSDN博客 说明 一般来说&#xff0c;界面开发中&#xff0c;如果不是大型的软件&#xff0c;就不必用QT之类的实现&#xff0c;用Tkinter已经足够&#xff0c;然而即便是Tkinter规…

软考:中级软件设计师:OSI/RM七层模型,网络技术标准与协议

软考&#xff1a;中级软件设计师:OSI/RM七层模型 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的…

No117.精选前端面试题,享受每天的挑战和学习

文章目录 断点续传怎么做的秒传怎么实现var let const 块级作用域ts Partial Omit 怎么实现的箭头函数有哪些限制箭头函数为什么不能作为构造函数promise常用apiMap和Object的区别vue怎么实现双向绑定 断点续传怎么做的 断点续传是指在文件下载或上传过程中&#xff0c;当连接…

ForexClub七夕交易大赛启动! 点燃交易之火为爱而战!

在这个充满激情的七夕季&#xff0c;ForexClub与您携手&#xff0c;掀起交易狂潮!点燃您心中的交易热忱&#xff0c;冲锋市场&#xff0c;赢取惊人奖金!别等了&#xff0c;参赛即有机会获得77美元的交易赠金&#xff0c;让我们一同为迸发的交易机会&#xff0c;燃烧一片天! 【大…

直流无刷电机工作原理及有感方波控制

BLDC方波控制 BLDC工作原理BLDC换向驱动过程有感控制模式 BLDC工作原理 首先要知道&#xff0c;BLDC转起来是基于什么原理 BLDC包括定子&#xff08;线圈&#xff09;和转子&#xff08;永磁体&#xff09;&#xff0c;线圈要通电&#xff0c;通电的线圈具有磁场&#xff0c;该…