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 {@Beanpublic Queue myQueue() {return new Queue("myQueue", true, false, false);}@Beanpublic DirectExchange defaultExchange() {return new DirectExchange("defaultExchange");}@Beanpublic 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()

整理完毕,完结撒花~ 🌻

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

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

相关文章

JavaScript中alter、confrim、prompt的区别及使用

文章目录 一、alter1.什么是alert?2.alter的使用 二、confrim1.什么是confrim?2.confrim的使用 三、prompt1.什么是prompt?2.prompt的使用 四、总结alter、confrim、prompt的区别 一、alter 1.什么是alert? 在JavaScript中&…

Elasticsearch安装Windows版

目录 1.:下载安装包,选择指定的版本,这里选择了7.8.0,官网下载地址: ​编辑 2:下载好之后解压,解压之后是这样的: 3:配置环境变量,跟JDK一样,…

单片机原理及应用:数码管定时秒表和LED计数器

先前我们介绍了定时器/计数器的概念与作用原理,下面我通过两个应用案例来分别演示定时器和计数器的用法。 第一个案例是用数码管配合定时器中断制作秒表,同理也可以自己改变时间单位制作不同精度的电子钟,修改方式我已经附在代码注释中了。 …

Redis:原理速成+项目实战——Redis实战7(优惠券秒杀+细节解决超卖、一人一单问题)

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:Redis:原理速成项目实战——Redis实战6(封装缓存工具(高级写法)&&缓存总…

VMware Workstation——安装VMware Workstation Pro 17

目录 一、下载 二、安装 1、双击安装 2、安装向导 3、最终用户许可协议 4、自定义安装 5、用户体验设置 6、快捷方式 7、准备升级 8、正在安装 9、安装完成 10、输入许可证密钥 11、激活成功 12、桌面图标 一、下载 下载 VMware Workstation Pro 二、安装 1、双…

odoo16 销售中订单价格的设置

odoo16 销售中订单价格的设置 产品设置好销售价格后,在建销售订单时,却不显价格,需在设置中把价格表选上 不选客户时,价格表显示空白 每次如何设置默认价格呢,如你去改程序或其它法,就不对了&#xff0c…

权限维持篇

一、Windows 1、 不死马权限维持 1.1 概述 <?php ignore_user_abort(); //关掉浏览器&#xff0c;PHP脚本也可以继续执行. set_time_limit(0);//通过set_time_limit(0)可以让程序无限制的执行下去 $interval 5; // 每隔*秒运行 do { $filename test.php; if(file_exi…

C++I/O流——(1)I/O流的概念

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 勤奋&#xff0c;机会&#xff0c;乐观…

低代码的应用场景

Gartner 在 2019 年的低代码调研报告中&#xff0c;曾经绘制过一张用来阐述低代码适用场景的“应用金字塔”&#xff0c;如下图所示&#xff1a; 应用级别划分&#xff1a;从下往上&#xff0c;分别为工作组级(Workgroup Class)、部门级(Departmental Class)、企业级(Enterpris…

力扣日记1.10-【二叉树篇】701. 二叉搜索树中的插入操作

力扣日记&#xff1a;【二叉树篇】701. 二叉搜索树中的插入操作 日期&#xff1a;2024. 参考&#xff1a;代码随想录、力扣 —————————————————————— 天哪&#xff0c;上次打开力扣还是2023&#xff0c;转眼已经2024&#xff1f;&#xff01; 两个星期过去…

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

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

Vue入门五(Vue-CLI项目搭建|vue项目目录介绍|vue项目开发规范|es6导入导出语法)

文章目录 一、Vue-CLI 项目搭建介绍node环境搭建1) 下载与安装2&#xff09;测试是否安装成功 安装vue-cli安装vue脚手架 创建Vue项目1&#xff09;使用命令创建项目2&#xff09;使用图形化界面创建项目 二、vue项目目录介绍1.命令行运行vue项目2.Pycharm中运行项目3.目录结构…