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.mzph.cn/news/616115.shtml

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

相关文章

酚醛胶面建筑模板 — 广西厂家直销,质保可靠

在现代建筑行业中,选择高质量的建筑板材对于确保施工质量和工程安全至关重要。广西厂家直销的酚醛胶面建筑板,以其卓越的质量和可靠的质保,成为了建筑行业的优选材料。 产品特性 卓越的耐候性:我们的酚醛胶面建筑板采用高品质酚醛…

图文看懂Android的Matrix原理

Matrix结构 在Android开发中,矩阵是一个非常强大且有趣的工具。位于图形库中,android.graphics.Matrix 是一个 33 的 float 矩阵,其主要作用是坐标变换。 它的结构大概是这样的: 其中每个位置的数值作用和其名称所代表的的含义是…

【写作】短篇《相遇与相守》

文章目录 前言背景角色故事梗概 第一章 缘分的邂逅第二章 心动的瞬间第三章 甜蜜的日子第四章 误会与和解第五章 共度风雨 前言 背景 时代背景 现代,一个充满忙碌和喧嚣的都市。这个都市是许多年轻人追求梦想和奋斗的地方,但也是许多人渴望寻找真挚感情…

Vue-18、Vue人员列表排序

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>列表排序</title><script type"text/javascript" src"https://cdn.jsdelivr.net/npm/vue2/dist/vue.js"></script…

Linux中DCHP与时间同步

目录 一、DHCP &#xff08;一&#xff09;工作原理 1.获取 2.续约 &#xff08;二&#xff09;分配方式 &#xff08;三&#xff09;服务器配置 1.随机地址分配 2.固定地址分配 二、时间同步 &#xff08;一&#xff09;ntpdate &#xff08;二&#xff09;chrony …

window-nginx注册服务(nginx-1.24.0.zip)

window-nginx注册服务(nginx-1.24.0.zip) 1、下载当前windows版nginx的稳定版本。 https://nginx.org/en/download.html 2、解压到指定目录中&#xff0c;这里解压到D盘根目录&#xff0c;D:\nginx-1.24.0 3、管理员打开命令行&#xff0c;可先进行相关操作&#xff0c;看一下n…

掌握Adams许可分析数据可视化技巧,轻松实现高效宣传

在这个信息爆炸的时代&#xff0c;数据可视化已经成为宣传和营销的重要工具。Adams许可分析数据可视化技巧以其独特的优势&#xff0c;帮助企业和个人更好地理解数据&#xff0c;呈现信息&#xff0c;吸引受众。本文将带您了解Adams许可分析数据可视化技巧&#xff0c;并探讨如…

create_metrology_model

set_system (border_shape_models, false) read_image (Image, D:/图像文件/调试图片/调试图片/cam220230726182355309.bmp) * draw_rectangle2 (3600, Row4, Column5, Phi3, Length12, Length22) Rect1Row:1010.37 Rect1Col:1189.15 phi:-0.188 RectLength1:450.531 RectLengt…

uni-app修改头像和个人信息

效果图 代码&#xff08;总&#xff09; <script setup lang"ts"> import { reqMember, reqMemberProfile } from /services/member/member import type { MemberResult, Gender } from /services/member/type import { onLoad } from dcloudio/uni-app impor…

Docker-阿里云镜像配置

1、创建文件 vi /etc/docker/daemon.json 刚安装的docker一般没有docker/daemon.json这些&#xff0c;需要自己新建 2、文件中添加内容 { "registry-mirrors": ["https://m3e4jmm0.mirror.aliyuncs.com"] } 3、重启 重新加载配置&#xff1a; systemct…

Google的Ndk-Sample学习笔记之一(hello-jniCallback)

前言: 近段时间因为项目的需求,需要使用JNI,所以下载了Google的Ndk-Sample学习下,准备记录 下来,留给后期自己查看 问题点一:JNI_OnLoad方法必须返回JNI的版本 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {JNIEnv *env;memset(&g_ctx, 0, sizeof(g_…

ABAP CDS 常用语法

文章目录 1.什么是abap cdsadap cds的优点 2.常用cds语法常用函数一 数值函数1.绝对值2. 最小整数不小于arg的值3.两个参数相除4.两个数相除切保留小数位5.最小整数不大于arg的值6.取除数的余数 二 字符串函数1.拼接字符2.替换字符3.截取字符串 三 常用的分支语句1.CASE 表达式…

亚马逊API:快速查询全球商品数据的技巧!

了解亚马逊API的限制和要求&#xff1a;在使用亚马逊API之前&#xff0c;您需要了解其限制和要求&#xff0c;例如请求频率限制、认证要求等。确保您遵循了API的使用条款&#xff0c;以避免不必要的麻烦。使用合适的亚马逊API服务&#xff1a;亚马逊提供了多个API服务&#xff…

Linux的SSH密钥认证快捷配置

本文适用&#xff1a;rhel5-9系列&#xff0c;同类系统(CentOS,AlmaLinux,RockyLinux等)、debian系(ubuntu)等也可参照 文档形成时期&#xff1a;2012-2024年 因系统版本不同&#xff0c;配置应略有差异&#xff0c;本文没有在细节上区分&#xff0c;但实践中发现均可配置成功 …

Linux实用命令

文章目录 一.系统与设置命令1. Linux的用户与用户组2.当前用户的详细信息 id3.提高普通用户的权限sudo4.实时显示进程的信息 top5.查看进程信息ps6.杀死进程kill7.关机重启8.显示当前登陆系统的用户who9.校正服务器时间,时区 timedatectl10.清屏命令clear 二.目录管理1.ls列出目…

Atlassian版本选择趋势是上云还是本地部署?全面分析两个版本的特性

近日&#xff0c;龙智联合Atlassian举办的DevSecOps研讨会年终专场”趋势展望与实战探讨&#xff1a;如何打好DevOps基础、赋能创新”在上海圆满落幕。龙智Atlassian技术与顾问咨询团队&#xff0c;以及清晖、JamaSoftware、CloudBees等生态伙伴的嘉宾发表了主题演讲&#xff0…

flutter封装dio请求库,让我们做前端的同学可以轻松上手使用,仿照axios的使用封装

dio是一个非常强大的网络请求库&#xff0c;可以支持发送各种网络请求&#xff0c;就像axios一样灵活强大&#xff0c;但是官网没有做一个demo示例&#xff0c;所以前端同学使用起来还是有点费劲&#xff0c;所以就想在这里封装一下&#xff0c;方便前端同学使用。 官网地址&a…

uniapp开发安卓应用微信开放平台创建应用如何获取签名

微信开放平台创建应用时需要应用的签名 比如我们开发了一个应用叫 “滴滴拉屎” 包名&#xff1a;uni.DIDILASHI #mermaid-svg-BUKbltDr30J93dUs {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-BUKbltDr30J93dUs .…

直播带货2024:洗牌、阵痛和暗流涌动

文 | 螳螂观察 作者 | 青月 一天前&#xff0c;大学生齐夏根本不会在直播间购买《额尔古纳河右岸》这种书籍。 她是喜欢看小说&#xff0c;但只钟爱悬疑无限流题材&#xff0c;至于《额尔古纳河右岸》这种讲述一个弱小民族顽强的抗争和优美的爱情的长篇小说&#xff0c;用齐…

设计模式原理与分析

一、设计模式原理与分析 1、概念 设计模式是在软件开发过程中总结得出的一些可重用的解决方案&#xff0c;它能解决一些实际的问题。一些常见的模式&#xff0c;比如工厂模式、单例模式等等。 封装、继承、多态只是类的三大特性&#xff0c;在程序设计时并不是说使用到了这三个…