交换机
概述
1、RabbitMQ 消息传递模型:Pub / Sub(发布 / 订阅模式)
(1)生产者生产的消息不会直接发送到队列
(2)实际上,通常生产者不知道消息传递到哪些队列,生产者只能将消息发送到交换机(exchange)
2、交换机
(1)接收来自生产者的消息,并将其推入队列
(2)由交换机的类型来决定,如何处理收到的消息:把消息放到特定队列 / 把消息推送到多个队列 / 丢弃它们
(3)只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与 Exchange 绑定,或者没有符合路由规则的队列,那么消息会丢失
3、类型
(1)直接(direct)
(2)主题(topic)
(3)标题(headers)
(4)扇出(fanout)
4、发布 / 订阅模式、工作队列模式
(1)工作队列模式不用定义交换机;发布 / 订阅模式需要定义交换机
(2)发布 / 订阅模式的生产方面向交换机发送消息,工作队列模式的生产方面向队列发送消息(底层使用无名交换机)
(3)发布 / 订阅模式需要设置队列、绑定交换机;工作队列模式不需要设置,实际上工作队列模式会将队列绑定到无名交换机
无名交换机
1、当不使用交换机时,basicPublish 中的 exchange 传入空串 ""
2、空字符串表示无名称交换机
内置交换类型的枚举类
public enum BuiltinExchangeType extends Enum<BuiltinExchangeType> {
public static final BuiltinExchangeType DIRECT;
public static final BuiltinExchangeType FANOUT;
public static final BuiltinExchangeType TOPIC;
public static final BuiltinExchangeType HEADERS;
}
通过一个允许完整参数集的接口,声明一个交换机
AMQP.Exchange.DeclareOk exchangeDeclare(String exchange,
String type,
boolean durable,
boolean autoDelete,
boolean internal,
Map<String,Object> arguments)
throws IOException
AMQP.Exchange.DeclareOk exchangeDeclare(String exchange,
BuiltinExchangeType type,
boolean durable,
boolean autoDelete,
boolean internal,
Map<String,Object> arguments)
throws IOException
1、exchange:交换机的名称
2、type:交换机的类型
3、durable:如果声明的是一个持久的交换机,则为 true(交换机将在服务器重新启动后继续存在)
4、autoDelete:如果服务器在不再使用该交换机时应删除它,则为 true
5、internal:如果交换机是内部的,即不能被客户端直接发布,则为 true
6、arguments:交换机的其他属性(构造参数)
7、返回一个声明确认方法,表示交换机已经成功声明
临时队列
1、创建临时队列
(1)主动声明一个服务器命名的排他性、自动删除、非持久性队列
(2)新队列的名称被保存在 AMQP.Queue.DeclareOk 结果的 queue 字段中
(3)返回一个声明确认方法,表示队列已成功声明
AMQP.Queue.DeclareOk queueDeclare() throws IOException
(4)获取临时队列名称
String getQueue()
2、断开消费者的连接,队列将被自动删除
绑定
1、binding 是 exchange 和 queue 之间的虚拟连接
(1)队列只对它绑定的交换机的消息感兴趣
(2)绑定用参数:routingKey
(3)绑定后,交换机类型决定队列接收的消息
2、将一个队列绑定到一个交换机
AMQP.Queue.BindOk queueBind(String queue,
String exchange,
String routingKey,
Map<String,Object> arguments)
throws IOException
(1)queue:队列的名称
(2)exchange:交换机的名称
(3)routingKey:绑定时要使用的路由键
(4)arguments:其他属性(绑定参数)
(5)如果绑定被成功创建,则返回一个绑定确认方法
Fanout
1、交换机将接收到的所有消息,广播到它绑定的所有队列中
2、处理消息的速度是所有的交换机类型中最快的
Direct
1、将消息只推送到它绑定的 routingKey 队列中
2、多重绑定:支持绑定的多个队列的 routingKey 都相同,,表现和 fanout 类似
Topic
1、发送 topic 交换机的消息的 routing_key 必须满足一定的要求
(1)必须是一个单词列表
(2)以 . 分隔开
(3)单词列表最多不能超过 255 个字节
(4)*:可以代替一个单词
(5)#:可以代替零个或多个单词
2、队列绑定情况
(1)若队列 routingKey 为 #,则该队列将接收所有数据,如 fanout
(2)若队列 routingKey 没有 # 和 * 出现,则该队列绑定类型就是 direct
com.rabbitmq.client.Envelope
1、封装一个任意的消息
public class Delivery extends Object
2、检索消息信封
public Envelope getEnvelope()
3、检索邮件正文
public byte[] getBody()
com.rabbitmq.client.Envelope
1、封装一组用于 AMQP 基本方法的参数
public class Envelope extends Object
2、获取该参数信封中包含的交付标签
public long getDeliveryTag()
3、获取包含在该参数信封中的交换机的名称
public String getExchange()
4、获取该参数包络中包含的路由密钥
public String getRoutingKey()
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战