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.rhkb.cn/news/236092.html

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

相关文章

Redis管道操作

文章目录 1. 问题提出2. 解决方案3. 案例演示4. 总结 1. 问题提出 如何优化频繁命令往返造成的性能瓶颈? Redis是一种基于C/S一级请求响应协议的TCP服务,一个请求会遵循一下步骤: 客户端向服务端发送命令分四步(发送命令-> …

个人网站制作 Part 1 | Web开发项目

文章目录 👩‍💻 基础Web开发练手项目系列:个人网站制作🚀 项目概述🔧 开发工具和环境配置🛠 项目实现步骤步骤 1: 创建HTML文件步骤 2: 添加CSS样式步骤 3: 链接CSS文件步骤 4: 添加JavaScript交互 &#…

Unity中向量的点乘、叉乘区别和作用以及经典案例

文章目录 点乘(Dot Product)叉乘(Cross Product)向量归一化(Normalize)其他作用 unity开发中我们要计算角度,判断位置,常用点乘、叉乘、归一化等等,我们看看他们的使用案…

tiktok_浅谈hook ios之发包x-ss-stub

frida-trace ios手机一部,需要越狱的电脑一台idacrackerXI 目标app: ipa 包,点击前往 密码:8urs 协议分析起始从抓包开始,个人习惯 一般安卓逆向可以直接搜关键词,但是ios 都在 Mach-O binary (reverse…

微服务-Gateway

案例搭建 官网地址 父Pom <com.alibaba.cloud.version>2.2.8.RELEASE</com.alibaba.cloud.version> <com.cloud.version>Hoxton.SR12</com.cloud.version> <com.dubbo.version>2.2.7.RELEASE</com.dubbo.version> <dependencyManagem…

SQL-DML增删改

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…

Zynq 电源

ZYNQ芯片的电源分PS系统部分和PL逻辑部分&#xff0c;两部分的电源分别是独立工作。PS系统部分的电源和PL逻辑部分的电源都有上电顺序&#xff0c;不正常的上电顺序可能会导致ARM系统和FPGA系统无法正常工作。 PS部分的电源有VCCPINT、VCCPAUX、VCCPLL和PS VCCO。 VCCPINT为PS内…

thinkphp美容SPA管理系统源码带文字安装教程

thinkphp美容SPA管理系统源码带文字安装教程 运行环境 服务器宝塔面板 PHP 7.0 Mysql 5.5及以上版本 Linux Centos7以上 基于thinkphp3.23B-JUI1.2开发&#xff0c;权限运用了Auth类认证&#xff0c;权限可以细分到每个功能&#xff0c; 增删改查功能一应俱全&#xff0c;整合了…

低维度向量的 Householder 反射变换 matlab 图示

1, 算法原理 设th 是一个弧度值&#xff0c; 令 Q | cos(th) sin(th) | | sin(th) -cos(th) | S span{ | cos(th/2.0) | } | sin(th/2.0) | x (x1, x2) 是一个平面上的二维向量 计算 y Qx Qx 则&#xff0c;y 是 x 通过有 S 定…

函数——自制函数(c++)

今天进入自制函数。 自制函数&#xff0c;需要自己定义其功能。比如&#xff0c;设置一个没有参数没有返回值的积木&#xff0c;叫“aaa”。那么&#xff0c;如果想要运行“aaa”&#xff0c;就需要以下代码&#xff1a; void aaa(); 告诉系统有“aaa”…

Java快速排序希尔排序归并排序

快速排序算法 快速排序的原理&#xff1a;选择一个关键值作为基准值。比基准值小的都在左边序列&#xff08;一般是无序的&#xff09;&#xff0c;比基准值大的都在右边&#xff08;一般是无序的&#xff09;。一般选择序列的第一个元素。 一次循环&#xff1a;从后往前比较&…

基于Python实现身份证信息识别

目录 前言身份证信息识别的背景与意义自动识别身份证的需求 实现环境与工具准备Python编程语言OpenCV图像处理库Tesseract OCR引擎 身份证信息识别算法原理图像预处理步骤(图像裁剪、灰度化 、二值化、去噪)信息提取与解析 Python代码实现通过OCR提取身份证号码代码解析身份证信…

【QML COOK】- 008-自定义属性

前面介绍了用C定义QML类型&#xff0c;通常在使用Qt Quick开发项目时&#xff0c;C定义后端数据类型&#xff0c;前端则完全使用QML实现。而QML类型或Qt Quick中的类型时不免需要为对象增加一些属性&#xff0c;本篇就来介绍如何自定义属性。 1. 创建项目&#xff0c;并编辑Ma…

【Linux驱动】Linux的中断系统 | 中断的重要数据结构

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《Linux驱动》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f3c0;Linux系统的中断⚽中断分类软中断和硬中断中断的上半部和下半部 ⚽tasklet⚽工…

基于uniapp封装的card容器 带左右侧两侧标题内容区域

代码 <template><view class"card"><div class"x_flex_header"><div><title v-if"title ! " class"title" :title"title" :num"num"></title></div><div><s…

系列四、Spring Security认证 授权(前后端不分离)

一、Spring Security认证 & 授权&#xff08;前后端不分离&#xff09; 1.1、MyWebSecurityConfigurerAdapter /*** Author : 一叶浮萍归大海* Date: 2024/1/11 21:50* Description:*/ Configuration public class MyWebSecurityConfigurerAdapter extends WebSecurityCo…

关注个人数据保护,肯尼亚发布新指南

近日&#xff0c;肯尼亚数据保护专员办公室&#xff08;ODPC&#xff09;发布了新的指导文件&#xff0c;旨在加强教育、通讯和数字信贷领域的数据保护措施&#xff0c;并提供了一个处理健康数据的通用指南。 这些指导意见是基于《数据保护法》&#xff08;DPA&#xff09;制定…

Appium 自动化测试

1.Appium介绍 1&#xff0c;appium是开源的移动端自动化测试框架&#xff1b; 2&#xff0c;appium可以测试原生的、混合的、以及移动端的web项目&#xff1b; 3&#xff0c;appium可以测试ios&#xff0c;android应用&#xff08;当然了&#xff0c;还有firefoxos&#xff09;…

《YOLO算法:基础+进阶+改进》报错解决 专栏答疑

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。《YOLO算法&#xff1a;基础进阶改进》专栏上线后&#xff0c;部分同学在学习过程中提出了一些问题&#xff0c;笔者相信这些问题其他同学也有可能遇到。为了让大家可以更好地学习本专栏内容&#xff0c;笔者特意推出了该篇…

canvas绘制流动的蚂蚁线(图文示例)

查看专栏目录 canvas示例教程100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…