RabbitMQ(十)队列的声明方式

news2024/11/16 17:51:28

目录

    • 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")
    					.exclusive(false) // 设置是否为独占队列,默认false
    					.autoDelete(false) // 设置是否为自动删除队列,默认alse
    					.build();

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

整理完毕,完结撒花~ 🌻

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

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

相关文章

Java十大经典算法——分治算法

定义: 分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个…

Linux安装nginx并设置为开机自启动

1.更新gcc安装包 yum install -y gcc pcre-devel zlib-devel2.下载文件并解压 命令如下 wget https://nginx.org/download/nginx-1.18.0.tar.gz //解压nginx tar -zxvf nginx-1.18.0.tar.gz //进入后进行指定安装位置 ./configure --prefix/usr/local/nginx //安装 make &…

adb 使用的出现 adb server is out of date. killing

我知道你们肯定看到这种播客 像这种解决问题的方法是暂时的 , 因为我们Android studio 中 , 你在查看后台的时候发现 你的Android studio 也占用了一端口 , 就是说你把 Android studio 杀掉了只要打开 Android studio 打开就还是 关闭 cmd adb 看到一个新的方法 , win 10 中…

110.线程(创建、终止)

一、线程概述 ◼ 与进程(process)类似,线程(thread)是允许应用程序并发执行多个任务的一种机 制。一个进程可以包含多个线程。同一个程序中的所有线程均会独立执行相同程序,且共 享同一份全局内存区域&…

NR HARQ-RTT-Timer和DRX RetransmissionTimer

这两个timer关联度比较高,放在一起看会比较清楚。 HARQ-RTT-Timer 对于同一个HARQ进程,当一次上行调度或下行调度,到下一次调度,需要一定的处理时间,这个时长就是HARQ RTT(Round Trip Timer)时间; 在NR …

【CUDA】windows下的CUDA安装

一、前言 windows10 下安装 CUDA ,首先需要下载安装包: CUDA toolkit(工具包) 二、安装前的准备 电脑环境检查 通过cmd,输入nvidia-smi 查看自己的驱动版本和支持的CUDA版本,如下图红圈标记位置 下载 …

vue购物车案例、v-model进阶、与后端交互

一 购物车案例 - 结算 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>购物车结算</title><script src"https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.min.js"></scr…

四川思维跳动:抖音能不能根据弹幕找到人?

在抖音这样的社交媒体平台上&#xff0c;用户可以通过发布抖音短视频与其他用户互动和交流。其中&#xff0c;弹幕是一种常见的互动方式&#xff0c;用户可以通过发送弹幕来表达对视频的评论、喜爱或者提问。然而&#xff0c;有用户担心自己的隐私可能因为弹幕内容被泄露&#…

新手搭建知识付费平台必备攻略:如何以低成本实现高转化?

明理信息科技知识付费saas租户平台 一、引言 随着知识经济的崛起&#xff0c;越来越多的知识提供者希望搭建自己的知识付费平台。然而&#xff0c;对于新手来说&#xff0c;如何以低成本、高效率地实现这一目标&#xff0c;同时满足自身需求并提高客户转化率&#xff0c;是一…

AI大语言模型会带来了新一波人工智能浪潮?

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

万能字符单词拼写 - 华为OD统一考试

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C++ 题目描述 有一个字符串数组 words 和一个字符串 chars。假如可以用 chars 中的字母拼写出 words 中的某个"单词"(字符串),那么我们就认为你掌握了这个单词。 words 的字符仅由 a-z 英文小写宁母组成,…

认知能力测验,⑥如何破解逻辑判断类测试题?

逻辑思维&#xff0c;是一个比较大的范围&#xff0c;在绝大多数的招聘中&#xff0c;认知能力测评形式多样&#xff0c;难度也较大&#xff0c;其中逻辑判断题型所涉及到的分类为&#xff1a;概念类、条件类、矛盾类、数字类、图形类等知识。比如奥数就是个好东西.....如果经历…

2024年01月微软更新Bug 已解决 !Explorer.EXE 提示:Windows无法访问指定设备、路径或文件。你可能没有适当的权限访问该项目。

前倾概要 近期大量出现如上图问题&#xff0c;杀毒&#xff0c;系统急救箱都没反应&#xff0c;罪魁祸首就是微软更新&#xff01; 点击什么都是&#xff1a;Windows无法访问指定设备、路径或文件。你可能没有适当的权限访问该项目。 但软件使用正常&#xff0c;还能通过建立…

8年经验之谈!一文看懂性能测试的流程!

每天做着点点点测试有没有危机感&#xff1f; 突然有一天&#xff0c;领导说&#xff1a;“小王&#xff0c;今天把996福报系统压一下&#xff0c;下班前把压测报告发我邮箱。” 啥&#xff1f;压测&#xff1f;今天&#xff1f;报告&#xff1f;怎么压&#xff1f;怎么写&am…

javaweb基础----JDBC(一)

一、什么是JDBC JDBC全称为Java数据库连接(Java Database Connectivity),是一套用于执行SQL语句的Java API。应用程序可以通过这套API连接到关系型数据库&#xff0c;并使用SQL语句完成对数据中数据的查询、增加、更新和删除等操作。 JDBC在应用程序与数据库之间起到了一个桥…

性能分析与调优: Linux 使用 iperf3 进行TCP网络吞吐量测试

目录 一、实验 1.环境 2.TCP网络吞吐量的微观基准测试 二、问题 1.iperf参数有哪些 2.iperf如何二进制安装 一、实验 1.环境 &#xff08;1&#xff09;主机 表1-1 主机 主机架构组件IP备注prometheus 监测 系统 prometheus、node_exporter 192.168.204.18grafana监测…

BI工具调研

1、前言 目前公司使用Tableau作为BI工具&#xff0c;但是感觉不是很好用&#xff0c;且国内市场已经不维护了&#xff0c;所以打算换下BI工具&#xff0c;因此需要针对当前市场开源和商业的BI工具进行调研&#xff0c;看看是买商业的还是用开源的。 基于以下部分开源的做了一个…

深度学习——R-CNN目标检测原理

R-CNN系列算法需要先产生候选区域&#xff0c;再对候选区域做分类和位置坐标的预测&#xff0c;这类算法被称为两阶段目标检测算法。近几年&#xff0c;很多研究人员相继提出一系列单阶段的检测算法&#xff0c;只需要一个网络即可同时产生候选区域并预测出物体的类别和位置坐标…

Jmeter 性能压测 —— 常遇问题与解决技巧!

问题1&#xff1a;如何在大并发测试下&#xff0c;让登录或者后续接口只执行一次&#xff1f; 分析&#xff1a; 这个问题网上的答案其实很多&#xff0c;但是大多不靠谱。 比如推荐使用仅一次控制器&#xff0c;但是仅一次控制器对线程组无效&#xff1b; 比如推荐跨线程组…

OpenAI ChatGPT-4开发笔记2024-05:windows下anaconda中设置visual studio code workspace

这里写自定义目录标题 1 安装anaconda和vscode2 Create an Anaconda Environment3 select Python Interpreter4 Workspace5 Open Workspace With File6 开发文件夹加入workspace7 美化 1 安装anaconda和vscode 标配。 2 Create an Anaconda Environment conda create --name…