RabbitMQ 基础操作

概念

从计算机术语层面来说,RabbitMQ 模型更像是一种交换机模型。
在这里插入图片描述

Queue 队列

Queue:队列,是RabbitMQ 的内部对象,用于存储消息。
RabbitMQ 中消息只能存储在队列中,这一点和Kafka相反。Kafka将消息存储在topic(主题)这个逻辑层面,而相对应的队列逻辑只是topic实际存储文件中的位移标识。

RabbitMQ不支持队列层面的广播消费。

交换器、路由键、绑定

交换器

Exchange :交换器,生产者将消息发送到Exchange,由交换器将消息路由到一个或者多个队列中,如果路由不到,则会返回给生产者或者丢弃消息。交换器

类型

RabbitMQ 中的交换器有四种类型:

direct(径直的)

它会吧消息路由到那些 BindingKeyRoutingKey 完全匹配的队列中。

fanout(扇出)

它会把所有发送到该交换器的消息路由所有与该路由器绑定的队列中

topic(模糊匹配)

它与 direct 类型的交换器相似,也是将消息路由到 BindingKey 和 RouingKey 相匹配的队列中,但这里的匹配规则有些不同:

  • RoutingKey 为一个点号“.” 分隔的字符串(被点号“.”分隔开的每一段独立的字符串称为一个单词),如 com.rabbitmq.clientjava.util.concurrent;
  • BindingKey 和 RoutingKey 一样也是点号分隔的字符串;
  • BindingKey 中可以存在两种特殊字符串 “*”,“#”,用于模糊匹配,其中星号用于匹配一个单词,“#”用于匹配零个和多个单词。

举个栗子

  • 路由键为 “com.rabbitmq.client” 的消息会同时路由到 queue1 和 queue2;
  • 路由键为 “com.hidden.client” 的消息会路由到 queue2中;
  • 路由键为 “com.hidden.demo” 的消息会路由到 queue2中;
  • 路由键为 “java.rabbitmq.demo”的消息会路由到 queue1中;
  • 路由键为 “java.util.concurrent” 的消息将会被丢弃或者返回给生产者(需要设置 mandatory 参数),因为它没有匹配任何路由键;

topic 类型的交换器

headers

headers 类型的交换器不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中 headers 属性进行匹配。headers 类型的交换器性能会很差,而且也不实用,基本上不会看到它的存在。

开发向导

RabbitMQ使用过程

生产者发送消息

  1. 连接 RabbitMQ Broker,建立一个 Connection ,开启 一个信道 Channel;
  2. 声明交换器,并设置相关属性;比如交换机类型、是否持久化等;
  3. 声明队列,并设置相关属性;如果是否排他、是否持久化、是否自动删除等;
  4. 通过 RoutingKey 将 Exchange 和 Queue 绑定;
  5. 发送消息到 RabbitMQ,其中包括路由键、交换器等信息;
  6. 交换器根据路由键查找匹配的队列;
  7. 如果找到,则将从生产者发送过的消息存入队列中;
  8. 如果没有找到,则根据生产者配置的属性选择丢弃或者回退给生产者;
  9. 关闭信道;
    10.关闭连接;

消费者接收消息

  1. 连接到 RabbitMq Broker,建立一个 Connection,开启一个信道 Channel;
  2. 向 RabbitMq Broker 请求消费对应队列的消息,可能会设置想要的回调函数,以及做一些准备工作;
  3. 接收消息;
  4. 消费者确认(ack)接收到的消息;
  5. RabbitMQ 从队列中删除已被确认消费的消息;
  6. 关闭信道;
  7. 关闭连接;

由使用过程发现,无论生产者或者消费者都需要和 RabbitMQ Broker 建立连接,这个连接(Connection)就是一条 TCP 连接,一旦 TCP 连接建立起来,客户端紧接着可以创建一个 AMQP 信道(Channel),每个信道都会被指派一个唯一ID。

信道是建立在 Connection 之上的虚拟连接,RabbitMQ 处理的每条 AMQP 指令都是通过信道完成的。
Connection 与 Channel

使用交换器和队列

代码清单

channel.exchangeDeclare(exchangeName,"direct",true);
String queueName = channel.queueDeclare().getQueue(); 
// or 声明队列
channel.queueDeclare(queueName,true,false,false,null);
channel.queueBind(queueName,exchangeName,routingKey);

exchangeDeclare 方法详解

exchangeDeclare 有多个重载方法,这些重载方法都是由下面这个方法中缺省的某些参数构成的。

Exchange.DeclareOk exchangeDeclare(String exchange,String type,boolean durable,boolean autoDelete,boolean internal,Map<String, Object> arguments) throws IOException;
参数说明
  1. exchange:交换器名称;
  2. type:交换器类型;如:direct、fanout、topic、headers;
  3. durable:是否持久化;持久化可以将交换器存盘,在服务器重启的时候不会丢失相关消息;
  4. autoDelete:是否自动删除;自动删除前提:只有有一个队列或交换器与这个交换器绑定了,之后所有与这个交换器绑定的都解绑。(只有绑过到解绑的过程,交换器才会删除,没有绑过则不会删除);
  5. internal:是否内置的;如果是内置交换器,则客户端无法直接发送消息到这个交换器,只能通过交换器路由到交换器这种方式;
  6. argument: 结构化参数;比如: alternate-exchange等;

queueDeclare 方法详解

Queue.DeclareOk queueDeclare() throws IOException;
Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,Map<String, Object> arguments) throws IOException;
参数说明
  1. queue:队列名称;
  2. durable:是否持久化;持久化的队列会存盘,服务器重启的时候可以保证不丢失相关信息;
  3. exclusive:是否排他;如果一个队列设置为排他,则该队列仅对首次声明它的连接可见,连接断开后自动删除;排他是基于连接(Connection)可见的。其他Connection 不可声明同名排他队列,而且即使排他队列设置了持久化,一旦连接关闭或者客户端退出,排他队列都会自动删除。
  4. autoDelete:是否自动删除;自动删除的前提是:至少有一个消费者连接到这个队列,之后所有与这个队列连接的消费者都断开后,才会自动删除;如果没有消费者连接过,则不会删除;
  5. arguments:队列的其他一些参数;如:x-message-ttlx-expiresx-max-lengthx-max-length-bytesx-dead-letter-exchangex-dead-letter-routing-keyx-max-priority等;

注意要点
生产者和消费者都能够使用 queueDeclare 来声明一个队列,但是如果消费者在同一个信道上订阅了另一个队列,就无法再声明队列了。必须先取消订阅,然后将信道置为“传输”模式,之后才能声明队列。

queueBind 方法详解

Queue.BindOk queueBind(String queue, String exchange, String routingKey) throws IOException;Queue.BindOk queueBind(String queue, String exchange, String routingKey, Map<String, Object> arguments) throws IOException;void queueBindNoWait(String queue, String exchange, String routingKey, Map<String, Object> arguments) throws IOException;
参数说明
  1. queue:队列名称;
  2. exchange:交换器名称;
  3. routingKey:用来绑定队列和交换器的路由键;
  4. argument:定义绑定的一些参数;

不仅可以将队列和交换器绑定起来,也可以将已经绑定的关系解除;

Queue.UnbindOk queueUnbind(String queue, String exchange, String routingKey) throws IOException;
Queue.UnbindOk queueUnbind(String queue, String exchange, String routingKey, Map<String, Object> arguments) throws IOException;

exchangeBind 方法详解

不仅可以将交换器与队列绑定,也可以将交换器与交换器进行绑定,用法如出一辙。

Exchange.BindOk exchangeBind(String destination, String source, String routingKey) throws IOException;
Exchange.BindOk exchangeBind(String destination, String source, String routingKey, Map<String, Object> arguments) throws IOException;
void exchangeBindNoWait(String destination, String source, String routingKey, Map<String, Object> arguments) throws IOException;

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

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

相关文章

Python与ArcGIS系列(九)自定义python地理处理工具

目录 0 简述1 创建自定义地理处理工具2 创建python工具箱0 简述 在arcgis中可以进行自定义工具箱,将脚本嵌入到自定义的可交互窗口工具中。本篇将介绍如何利用arcpy实现创建自定义地理处理工具以及创建python工具箱。 1 创建自定义地理处理工具 在arctoolbox中的自定义工具箱…

【经验之谈·高频PCB电路设计常见的66个问题】

文章目录 1、如何选择PCB 板材&#xff1f;2、如何避免高频干扰&#xff1f;3、在高速设计中&#xff0c;如何解决信号的完整性问题&#xff1f;4、差分布线方式是如何实现的&#xff1f;5、对于只有一个输出端的时钟信号线&#xff0c;如何实现差分布线&#xff1f;6、接收端差…

模电 01

一.半导体基本知识 1.优点&#xff1a;体积小、重量轻、使用寿命长、输入功率小、功率转换效率高。 2.性能介于导体与绝缘体 3.常用半导体材料&#xff1a;硅&#xff08;SI&#xff09; 镉&#xff08;Ge&#xff09;,化合物半导体&#xff1a;砷化镓&#xff08;GaAs&…

网工内推 | 字节原厂,正式编,网络工程师,最高30K*15薪

01 字节跳动 招聘岗位&#xff1a;网络虚拟化高级研发工程师 职责描述&#xff1a; 1、负责字节跳动虚拟网络产品的研发&#xff0c;包括但不局限于网络VPC、NAT、LB负载均衡等&#xff1b; 2、负责字节跳动网络基础平台的研发&#xff0c;包括但不局限于网络控制面系统、容器…

【Java 进阶篇】JavaScript JSON 语法入门:轻松理解数据的序列化和反序列化

嗨&#xff0c;亲爱的小白们&#xff01;欢迎来到这篇关于 JavaScript 中 JSON&#xff08;JavaScript Object Notation&#xff09;语法的入门指南。JSON 是一种轻量级的数据交换格式&#xff0c;广泛应用于前端开发中。通过这篇博客&#xff0c;我将带你深入了解 JSON 的语法…

Redis从入门到精通(二)- 入门篇

文章目录 0. 前言1. 入门篇[【入门篇】1.1 redis 基础数据类型详解和示例](https://icepip.blog.csdn.net/article/details/134438573)[【入门篇】1.2 Redis 客户端之 Jedis 详解和示例](https://icepip.blog.csdn.net/article/details/134440061)[【入门篇】1.3 redis客户端之…

ubuntu linux C/C++环境搭建

目录 前言 1.1 vim安装与配置 ​编辑 1.2 vim配置 1.3 gcc g编译器的安装 与gdb调试器的安装 1.4 写个C/C程序测试一下 1.6 vscode安装 1.7 vscode插件下载​编辑 前言 在开始C之前&#xff0c;我们需要搭建好C的开发环境&#xff0c;我这里使用的操作系统是ubuntu Linux&a…

键盘映射笔记

dumpkeys命令用于显示当前系统中定义的键盘映射表。它可以帮助用户查看和理解系统中的键盘布局和键盘映射规则。 当用户执行dumpkeys命令时&#xff0c;它会读取系统中的键盘映射表文件&#xff08;通常是/etc/keymaps或/etc/console/boottime.kmap.gz&#xff09;&#xff0c;…

利用SVD对图像进行压缩

利用SVD对图像进行压缩 使用SVD能够对数据进行降维&#xff0c;对图像进行SVD&#xff0c;降维之后然后重构数据&#xff0c;还原后的图像就是压缩后的图像。 SVD SVD进行图像压缩所依据的数学原理就是矩阵的近似表示&#xff1a; A m n ≈ U m k ∑ k k V k n T A_{m\…

git修改commit历史提交时间、作者

1、修改最近的几条记录&#xff0c;进入提交记录列表&#xff0c;修改提交记录模式 git rebase -i HEAD~3 // 修改最近的三条记录&#xff0c;顺序排列按提交时间升序 指令说明&#xff1a; pick&#xff1a;保留该commit&#xff08;缩写:p&#xff09; reword&#xff1a…

苍穹外卖—解决前端时间属性显示问题

项目场景&#xff1a; 点击员工管理 出现显示时间属性问题 输入员工姓名为zhangsan 现实的时间属性是数组类型 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 例如&#xff1a;数据传输过程中数据不时出现丢失的情况&#xff0c;偶尔会丢失一部分数据 APP …

AD从原理图到PCB超详细教程

AD超详细教程 前言一、建立一个工程模板二、原理图1.设计原理图。2.使用AD自带库和网上开源原理图库3.画原理图库4.编译原理图 三、PCB1.确定元器件尺寸大小2.绘制PCB Library①使用元器件向导绘制元件库②原理图与PCB的映射 3.绘制PCB①更新PCB②调整元件位置③布线④漏线检查…

Git 远程仓库(Github)

目录 添加远程库 查看当前的远程库 提取远程仓库 推送到远程仓库 删除远程仓库 Git 并不像 SVN 那样有个中心服务器。 目前我们使用到的 Git 命令都是在本地执行&#xff0c;如果你想通过 Git 分享你的代码或者与其他开发人员合作。 你就需要将数据放到一台其他开发人员…

OSG文字-各种文字效果(边框、阴影及颜色倾斜)示例(2)

各种文字效果(边框、阴影及颜色倾斜)示例 各种文字效果(边框、阴影及颜色倾斜)示例的代码如程序清单9-2所示&#xff1a; 1. /* 各种文字效果(边框、阴影及颜色倾斜)示例 */ 2. osg::ref_ptr<osg::Camera> createAllKindText(const string &strDataFolder) 3. {…

问题 R: 胜利大逃亡(HUST)

#include <deque> #define inf 200000 #include<iostream> #include<queue> using namespace std;// 迷宫坐标 int map[59][59][59] { 0 };// 可访问标记 int visit[51][51][51] { 0 }; // 移动方式 int next1[7][4] { {1,0,0},{-1,0,0}, {0,1,0},{0,-1,…

mysql主从搭建(docker)

一、主从概述 MySQL主从又叫Replication、AB复制。简单讲就是A与B两台机器做主从后&#xff0c;在A上写数据&#xff0c;另外一台B也会跟着写数据&#xff0c;实现数据实时同步。有这样几个关键点&#xff1a; 1&#xff09;MySQL主从是基于binlog&#xff0c;主上需开启binl…

Altium Designer学习笔记6

原理图库的制作&#xff0c;SMA元件的制作&#xff1a; 图形不是很重要&#xff0c;重要的是管脚的功能。 Design Item ID和Designator两个值是要注意的。 进行Place放置&#xff0c;切换到原理图工作区&#xff0c;测试下功能。 AD9851元件库制作&#xff1a; 不需要再新建原…

IDEA中更换java项目JDK

我们打开IDEA 打开项目 然后选择 File 下的 Project Structure 这里 我们下拉选择自己需要的JDK Sources这里 也要设置一下JDK对应版本 然后 上面这个 Project 中 也要设置一下对应jdk的版本 保持一直 然后 我们打开 File 下的 Settings 然后 找到如下图配置 如果JKD版本看…

企业app软件定制开发的重点是什么?|小程序网站搭建

企业app软件定制开发的重点是什么&#xff1f;|小程序网站搭建 在当今数字化时代&#xff0c;企业对于信息技术的依赖越来越大。为了适应市场需求并提高内部运营效率&#xff0c;许多企业开始寻求定制开发企业app软件。这种定制开发可以根据企业的具体需求和业务流程进行个性化…

基于像素特征的kmeas聚类的图像分割方案

kmeans聚类代码 将像素进行聚类&#xff0c;得到每个像素的聚类标签&#xff0c;默认聚类簇数为3 def seg_kmeans(img,clusters3):img_flatimg.reshape((-1,3))# print(img_flat.shape)img_flatnp.float32(img_flat)criteria(cv.TERM_CRITERIA_MAX_ITERcv.TERM_CRITERIA_EPS,2…