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;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023年【T电梯修理】考试题及T电梯修理考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 T电梯修理考试题是安全生产模拟考试一点通总题库中生成的一套T电梯修理考试报名&#xff0c;安全生产模拟考试一点通上T电梯修理作业手机同步练习。2023年【T电梯修理】考试题及T电梯修理考试报名 1、【多选题】GB/T1…

什么是PyQt?

什么是Qt? Qt是一个著名的跨平台C图形用户界面应用程序开发框架。它由Qt公司开发,于1995年首次发布。Qt支持各种桌面,嵌入式和移动平台。 Qt的特点包括: 跨平台支持:Qt应用程序可以编译到多种平台运行,包括Windows,Mac,Linux,Android,iOS等。这大大简化了跨平台应用程序的开…

2023年亚太杯数学建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 最短时…

超级实用的程序员接单平台,看完少走几年弯路,强推第一个!

”前途光明我看不见&#xff0c;道路曲折我走不完。“ 兜兜转转&#xff0c;心心念念&#xff0c;念念不忘&#xff0c;必有回响。终于找到了....... 网络上好多人都在推荐程序员线上接单&#xff0c;有人说赚得盆满钵满&#xff0c;有的人被坑得破口大骂&#xff0c;还有的人…

解决Zotero不显示标签的问题

目录 问题描述 解决办法&#xff1a; 问题描述 Zotero是一款学习助手&#xff0c;可以帮助我们梳理文献&#xff0c;方便我们整理。 最近电脑从windows换到mac&#xff0c;重新安装了Zotero&#xff0c;发现之前的一直设置都没有了。比如设置好的标签信息不显示了。如下图: …

matlab设置背景颜色

matlab默认的背景颜色是纯白RGB(255,255,255)&#xff0c;纯白太刺眼&#xff0c;看久了&#xff0c;眼睛会酸胀、疼痛&#xff0c;将其改成豆沙绿RGB(205,123,90)&#xff0c;或者给出浅绿色RGB(128,255,255), 颜色就会柔和很多&#xff0c;眼睛感觉更舒适。     下面介绍在…

Java使用x-www-form-urlencoded发请求

平常在开发过程中用的最多的就是JSON格式&#xff0c;请求编码就是 application/json&#xff0c;但偏偏有些接口是 x-www-form-urlencoded&#xff0c;怎么办呢&#xff0c;重新封装喽 在POSTMan工具是叫 x-www-form-urlencoded 在 APIpost工具中是叫 urlencoded Map<Str…

2023年【施工升降机司机(建筑特殊工种)】最新解析及施工升降机司机(建筑特殊工种)考试资料

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 施工升降机司机(建筑特殊工种)最新解析参考答案及施工升降机司机(建筑特殊工种)考试试题解析是安全生产模拟考试一点通题库老师及施工升降机司机(建筑特殊工种)操作证已考过的学员汇总&#xff0c;相对有效帮助施工升…

SMART PLC累计流量功能块(梯形积分法+浮点数累加精度控制)

S7-200SMART PLC数值积分器相关知识请参考下面文章链接: SMART PLC数值积分器功能块(矩形+梯形积分法完整源代码)-CSDN博客文章浏览阅读153次。PLC的数值积分器算法也可以参考下面文章链接:PLC算法系列之数值积分器(Integrator)-CSDN博客数值积分和微分在工程上的重要意义不…

C语言进阶之冒泡排序

✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》 &#x1f388;跟着猪巴戒&#xff0c;一起学习C语言&#x1f388; 目录 前情回顾 1、回调函数 2、冒泡排序 3、库函数qsort cmp&#xff08;sqort中的比较函数&#xff0c;需要我们自定义&#xff09; …

c++|内联函数

一、概念 以inline修饰的函数叫做内联函数&#xff0c;编译时c编译器会在调用函数的地方展开&#xff0c;而不会建立栈帧&#xff0c;提升了程序运行的效率 例子&#xff1a; #include <iostream> using namespace std;int Add(int left, int right) {return left - ri…

详解硬盘的接口、总线和协议

总线&#xff1a;总线是计算机系统中用于连接各个硬件组件的一种通信方式&#xff0c;它可以实现数据、地址和控制信号的传输。在服务器中&#xff0c;内部总线起着承载数据和控制信号的重要作用。总线在单位时间内能传输数据量称为带宽。分为SATA&#xff0c;SAS&#xff0c;P…

Deep Learning for Monocular Depth Estimation: A Review.基于深度学习的深度估计

传统的深度估计方法通常是使用双目相机&#xff0c;计算两个2D图像的视差&#xff0c;然后通过立体匹配和三角剖分得到深度图。然而&#xff0c;双目深度估计方法至少需要两个固定的摄像机&#xff0c;当场景的纹理较少或者没有纹理的时候&#xff0c;很难从图像中捕捉足够的特…

模电 01

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

centos安装kingbase(人大进仓)数据库

一、kingbase官网 https://www.kingbase.com.cn/rjcxxz/index.htm二、官网获取安装镜像文件和licence 三、安装步骤 1、创建新用户kingbase及其同名分组,以及家目录,并设置密码 useradd -m -U kingbase passwd kingbase2、创建自定义安装路径 su root mkdir -p /opt/Kingba…

Nacos介绍与使用

Nacos介绍与使用 文章目录 Nacos介绍与使用一. 什么是Nacos1 Nacos功能1.1 配置中心1.2 注册中心 2.为什么要使用Nacos 二.Nacos 部署安装1. Nacos 部署方式2. Nacos 安装3. 配置数据源4. 开启控制台授权登录&#xff08;可选&#xff09; 三. Nacos配置中心的使用1. 创建配置信…

暴力求解欲哭无泪之保安问题

身为程序员哪一个瞬间让你最奔溃&#xff1f; > 提醒&#xff1a;在发布作品前&#xff0c;请把不需要的内容删掉。 方向一&#xff1a;身为程序员遇到过的奔溃瞬间 写题目想到第一个方法便是暴力求解,然后少情况 题目如下: 方向二&#xff1a;如何解决遇到的奔溃瞬间 不…

[Docker]八.Docker 容器跨主机通讯

一.跨主机通讯原理 在主机192.168.31.140上的docker0(172.17.0.0/16)中有一个容器mycentos( 172.17.0.2/16), 在主机192.168.31.81上的docker0(172.17.0.0/16)中有一个容器mycentos( 172.17.0.2/16),然后在主机192.168.31.140上ping主机192.168.31.81,发现ping不通要实现两个主…

数字化转型导师坚鹏:数字化时代银行网点厅堂营销5大特点分析

数字化时代银行网点厅堂营销存在以下5大特点&#xff1a; 1、产品多样化&#xff1a;在数字化时代&#xff0c;银行的产品和服务变得更加多样化。除了传统的存款、贷款、理财等金融服务外&#xff0c;还新增了各种创新产品&#xff0c;如网上银行、移动支付、投资咨询、保险、…

C++刷题 -- 二分查找

C刷题 – 二分查找 文章目录 C刷题 -- 二分查找一、原理二、例题1.二分查找2.使用二分查找确定target左右边界3.x的平方根 一、原理 条件&#xff1a;数组为有序数组&#xff0c;数组中无重复元素&#xff0c;因为一旦有重复元素&#xff0c;使用二分查找法返回的元素下标可能…