RabbitMQ(十)队列的声明方式

目录

    • 1.编程式声明
      • 补充:RabbitTemplate 和 AmqpAdmin 的区别
    • 2.声明式声明
      • 补充:new Queue() 和 QueueBuilder.durable(queueName).build() 的区别

在这里插入图片描述

背景:

在学习 RabbitMQ 的使用时, 经常会遇到不同的队列声明方式,有的是是使用 @Bean 注入,有的是通过 channel.queueDeclare() 来声明队列,在此进行整理。

在 Spring Boot 集成 RabbitMQ 时,声明队列的方式主要分为两种:编程式声明声明式声明

1.编程式声明

  • 直接在 Java 代码中通过 RabbitMQ 客户端 API(如:com.rabbitmq.client.Channel)声明队列。例如,使用 rabbitTemplate.execute() 方法或 amqpAdmin.declareQueue() 方法。
@Autowired
private RabbitTemplate rabbitTemplate;

@Autowired
private AmqpAdmin amqpAdmin;

// 使用RabbitTemplate
public void declareQueueWithRabbitTemplate(String queueName) throws IOException {
    rabbitTemplate.execute(channel -> {
        channel.queueDeclare(queueName, true, false, false, null);
        return null;
    });
}

// 使用AmqpAdmin
public void declareQueueWithAmqpAdmin(Queue queue) {
    amqpAdmin.declareQueue(queue);
}

// 示例声明队列
public void declareMyQueue() {
    Queue queue = new Queue("myQueue", true, false, false);
    amqpAdmin.declareQueue(queue);
}

补充:RabbitTemplate 和 AmqpAdmin 的区别

1)RabbitTemplate:

  • RabbitTemplate 是 Spring AMQP 为开发者提供的一个模板类,用于简化发送和接收消息的操作。它封装了底层的 AMQP 客户端 API,提供了一系列方便的方法,如:
    • convertAndSend():用于发送消息;
    • receiveAndConvert():用于接收消息。
  • RabbitTemplate 可以直接发送和接收消息,同时也支持消息转换、回调函数等功能,用于处理消息的发送结果或处理接收到的消息内容。
  • RabbitTemplate 主要用于日常消息的生产和消费操作,它具备丰富的消息转换和路由能力,能够大大简化 RabbitMQ 的交互代码。

2)AmqpAdmin:

  • AmqpAdmin 接口提供了管理和维护 AMQP 基础设施的能力,包括创建、删除交换机、队列和绑定关系等。
  • 实现 AmqpAmin 接口的典型类是 RabbitAdmin,它可以 在应用程序启动时自动检测并声明所需的交换机、队列和绑定,或者在运行时根据需要 动态管理这些资源
  • AmqpAdmin 不涉及消息的发送和接收,而是 专注于 RabbitMQ 的配置和管理界面,确保消息的路由规则和存储结构已经就绪。

总结: RabbitTemplate 更侧重于消息的发送和接收,而 AmqpAdmin 更关注于 RabbitMQ 中间件本身的配置和管理。在实际项目中,通常会同时使用这两个组件来完成 RabbitMQ 的整体集成和消息流转。


2.声明式声明

  • 通过 Spring AMQP 的 注解驱动 方式在启动时自动声明队列。这种方式更符合 Spring Boot 的 约定优于配置 的理念,更加简洁和自动化。例如:使用 @Bean@RabbitListener 注解。
@Configuration
public class RabbitConfig {

    @Bean
    public Queue myQueue() {
        return new Queue("myQueue", true, false, false);
    }
    
    @Bean
    public DirectExchange defaultExchange() {
        return new DirectExchange("defaultExchange");
    }
    
    @Bean
    public Binding binding(Queue myQueue, DirectExchange defaultExchange) {
        return BindingBuilder.bind(myQueue).to(defaultExchange).with("routingKey");
    }
    
    @RabbitListener(queues = "myQueue")
    public void processMessage(String message) {
        // 处理消息逻辑
    }
}

在上述代码中:

  • myQueue Bean 会自动声明一个名为 myQueue 的队列;
  • defaultExchange Bean 会自动声明一个名为 defaultExchange 的直连交换机;
  • binding Bean 会将队列与交换机绑定起来;
  • @RabbitListener 注解表明当有消息到达 “myQueue” 队列时,会调用 processMessage 方法进行处理。

补充:new Queue() 和 QueueBuilder.durable(queueName).build() 的区别

在 Spring Boot 项目中使用 RabbitMQ 时,创建队列主要有两种方式:

  • 直接实例化 Queue 对象;
  • 使用 QueueBuilder 构建器。

1)使用 new Queue(queueName) 创建:

new Queue("queueName");

源码如下:

/**
 * The queue is durable, non-exclusive and non auto-delete.
 * ------------------------------
 * 队列是持久化的、非独占的、非自动删除的。
 *
 * @param name the name of the queue.
 */
public Queue(String name) {
   this(name, true, false, false);
}

这种方式简单直接地创建了一个非持久化的、非独占的、自动删除的队列。这意味着:

  • 持久化(durable): 如果 RabbitMQ 服务器重启,这个队列不会丢失。
  • 非独占(non-exclusive): 多个消费者可以同时连接并消费该队列的消息。
  • 非自动删除(non auto-delete): 当所有与该队列绑定的消费者都断开连接后,队列不会被自动删除。

2)使用 QueueBuilder.durable(queueName).build() 创建:

QueueBuilder.durable("queueName").build();

使用 QueueBuilder 可以更灵活的配置队列属性。上述代码创建的是一个持久化的队列,具有以下特点:

  • 持久化(Durable): 即使 RabbitMQ 服务器重启,这个队列也会保留下来。
  • 其他属性如:非独占、自动删除保持默认设置,即:不是独占的且不自动删除

若要设置更多属性,可以继续调用 QueueBuilder 的方法,例如:

Queue queue = QueueBuilder.durable("queueName").build();

总结: 使用 new Queue(queueName) 的方式 只适用于需要快速创建一个非持久化的基本队列的情况。而通过 QueueBuilder 则可以 根据需求详细配置队列的各种属性,包括但不限于:持久化、独占性和自动删除等。在生产环境中,为了保证消息可靠性,通常会选择创建持久化的队列,因此 推荐使用 QueueBuilder.durable()

整理完毕,完结撒花~ 🌻

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

行为型设计模式——责任链模式

责任链模式 在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。例如,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数…

怎么用 Excel 做出专业的 project 甘特图?10个步骤和60个模板

使用Excel来创建Project甘特图的步骤包括:1、基本设置和布局调整、2、数据输入和时间线配置、3、任务依赖性和进度跟踪、4、视觉效果优化、5、数据更新和维护、6、模板保存和共享。尤其突出基本设置和布局调整,它是构建一个清晰、有效的甘特图的基础。 甘…

适用于 Windows 的 12 个最佳免费磁盘分区管理器软件

分区是与其他部分分开的硬盘驱动器部分。它使您能够将硬盘划分为不同的逻辑部分。分区软件是一种工具,可帮助您执行基本选项,例如创建、调整大小和删除物理磁盘的分区。许多此类程序允许您更改磁盘片的标签以便于识别数据。 适用于 Windows 的 12 个最佳…

编译工具 Cmake 教程——翻译自外网

Make Tutorial hello:echo "Hello, World"Makefile Syntax targets: prerequisitescommandcommandcommand目标是文件名,以空格分隔。通常,每条规则只有一个。 这些命令是通常用于创建目标的一系列步骤。这些需要以制表符开头,而不…

RLHF与LLM训练的碰撞:寻找最佳实践之路!

了解更多公众号:芝士AI吃鱼 在讨论大型语言模型(LLM)时,无论是在研究新闻还是教程中,经常提到一个称为“带有人类反馈的强化学习”(RLHF)的过程。由于RLHF能够将人类偏好纳入优化过程&#xff0…

K8s Pod详解

1.Pod结构 每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类: 用户程序所在的容器,数量可多可少 Pause容器,这是每个Pod都会有的一个根容器,它的作用有两个: 可以以它为依据,评估整个…

Redis 发布订阅

目录 1.Redis Unsubscribe 命令 - 指退订给定的频道。简介语法可用版本: > 2.0.0返回值: 这个命令在不同的客户端中有不同的表现。 示例 2.Redis Subscribe 命令 - 订阅给定的一个或多个频道的信息。简介语法可用版本: > 2.0.0返回值: 接收到的信息 示例 3.Redis Pubsub …

功能自动化测试流程

1概述 本流程是描述软件功能自动化测试过程中的步骤、内容与方法,明确各阶段的职责、活动与产出物。 2流程活动图 3活动说明 3.1测试计划(可选) 与以前的测试计划过程一致,只是在原来的测试计划中,添加对项目实施自动…

Vue+element-china-area-data实现省市区三级联动

安装依赖 npm install element-china-area-data -S cnpm install element-china-area-data -S 引用 import { provinceAndCityData, regionData, provinceAndCityDataPlus, regionDataPlus, CodeToText, TextToCode } from element-china-area-data; provinceAnd…

父类,父类的分类、子类 同时重写方法,调用问题

做一个猜想,当父类、父类的分类、子类 都写了同一个方法,那么在调用的时候会优先调用哪个方法呢?我们可以先写一个简单的demo implementation Person (void)test {NSLog("%",self.class); }end然后是Person的分类 #import "…

springBoot容器功能

一、添加组件 1、Configuration 1.1基本使用 新建一个MyConfig类 , 演示Configuration Bean的作用 , 即相当于spring中的beanx.xml, Bean 就是bean标签 此方法,默认是单实例, 即获取多少次都是同一个对象 自定义名字&#xff0…

核酸汇·2024第三届中国核酸药物与新型疫苗产业大会将于5月上海召开

近年来,全球上市的核酸药物数量逐年递增,核酸药物也逐渐成为生物医药投资的重点以及医药企业研发的热点。作为一种具有颠覆性技术的药物,小核酸药物具备多种优势,在抗击传染病、治疗罕见病和慢性病等领域具有巨大的发展潜力, 目前…

安防视频监控系统EasyCVR设备分组中在线/离线数量统计的开发与实现

安防视频监控EasyCVR系统具备较强的兼容性,它可以支持国标GB28181、RTSP/Onvif、RTMP,以及厂家的私有协议与SDK,如:海康ehome、海康sdk、大华sdk、宇视sdk、华为sdk、萤石云sdk、乐橙sdk等。EasyCVR平台可覆盖多类型的设备接入&am…

数据加工:从原始数据到有价值的信息

在当今数字化的时代,数据已经成为了企业和组织最宝贵的资产之一。然而,原始数据往往需要经过加工和处理,才能转化为有价值的信息和知识。数据加工是指将原始数据进行处理和分析,以提取有用的信息和知识的过程。数据加工的重要性不…

YOLOv8-Seg改进:轻量化改进 | MobileNetV3,轻量级骨架首选

🚀🚀🚀本文改进:MobileNetV3的创新点包括:使用自适应瓶颈宽度、借鉴SENet中的Squeeze-and-Excitation机制、引入h-swish激活函数等。 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1)手把手教…

base64与BytesIO图片进行编码、解码;api调用

base64与BytesIO简单介绍 io.BytesIO 和 Base64 编码都是用于在内存中处理二进制数据的方法,但它们的目的和使用场景有所不同。 1) io.BytesIO io.BytesIO 是 Python io 库中的一个类,它提供了一个在内存中处理二进制数据的接口&#xff0…

使用srs_librtmp实现RTMP推流

1、背景 由于项目有需求在一个现有的产品上增加RTMP推流的功能,目前只推视频流。 2、方案选择 由于是在现有的产品上新增功能,那么为了减少总的成本,故选择只动应用软件的来实现需求。 现有的产品中的第三方库比较有限,连个ffmp…

PPT模板,免费下载

找PPT模板、素材,就上这几个网站,免费下载。 1、菜鸟图库 https://www.sucai999.com/search/ppt/0_0_0_1.html?vNTYxMjky 菜鸟图库素材非常齐全,设计、办公、图片、视频等素材这里都能找到,PPT模板数量很可观,模板样…

《AI基本原理和python实现》栏目介绍

一、说明 栏目《AI基本原理和python实现》的设计目的是为了实现相关算法的python编程。因为用python实现AI需对相关的python库进行全方位了解,本栏目基本包含了【机器学习】相关的经典算法,除此之外还包括了数据分析、时间序列等一些概念和相关python代码…

斯坦福Mobile ALOHA提到的ACT之外的另两项技术:Diffusion Policy、VINN

前言 本文接上一篇文章《斯坦福机器人Mobile ALOHA的关键技术:动作分块ACT的算法原理与代码剖析》而来,当然最开始本文是作为上一篇文章的第二、第三部分的 但因为ACT太过关键,除了在上一篇文章中写清楚其算法原理之外,还得再剖…