交换机

概述

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()
posted @   半条咸鱼  阅读(269)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示