RabbitMQ交换机

最近刚开始学习RabbitMQ,这里记录一下我的学习心得,欢迎大家来讨论!

RabbitMQ的交换机有四种类型:分别是 直接(direct), 主题(topic) ,标题(headers) , 扇出(fanout)

接下来主要讲解的是: 直接(direct), 主题(topic) ,扇出(fanout)

我觉得可以用mybatis的思想来理解这三种类型:

一、扇出(fanout):是一对多的;它将接收到的信息广播到每个它绑定的队列;

绑定代码:

//连接Channel
Channel channel = RabbitMqUtils.getChannel();
//定义交换机的名称和类型
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
//交换机绑定队列(方法的参数分别为:队列名、交换机名、路由键)
channel.queueBind(QueueName, EXCHANGE_NAME, "");

解释:当定义了交换机的类型为【fanout】时,绑定的路由键是是可以忽略的,信息会发布到所有绑定这个交换机的队列。

二、直接(direct):是一对一的;它将接收到的信息根据绑定的RoutingKey,发布到对应的RoutingKey队列;

绑定代码:

//连接Channel
Channel channel = RabbitMqUtils.getChannel();
//定义交换机的名称和类型
channel.exchangeDeclare(EXCHANGE_NAME, "direct");
//交换机绑定队列(方法的参数分别为:队列名、交换机名、路由键)
String QueueName1 = "Q1";
String QueueName2 = "Q2";
channel.queueBind(QueueName1, EXCHANGE_NAME, "orange");
channel.queueBind(QueueName2, EXCHANGE_NAME, "black");
channel.queueBind(QueueName2, EXCHANGE_NAME, "green");

解释:当定义了交换机的类型为【direct】时,绑定的路由键是必须要定义的,消息会根据routingKey来发布到对应的队列,如果这时候传递过来的信息的路由键为"red",因为没有进行绑定无法匹配,则会被丢弃。

三、主题(topic):是多对多的;当我们想接收的日志类型有info.base 和 info.advantage,但是某个队列只需要info.base时,这时使用redict是明显做不到的,这时候只能使用topic;topic和redict的用法是一致的,区别在于路由键的使用,所以主题交换机的路由键是不能随意写的,它必须满足一定的要求。

要求:必须是一个单 词列表,以点号分隔开。这些单词可以是任意单词,比说:"stock.usd.nyse", "nyse.vmw", "quick.orange.rabbit".这种类型的。当然这个单词列表最多不能超过 255 个字节。

在这个规则列表中,其中有两个替换符是大家需要注意的:↓
*(星号)可以代替一个单词 ,#(井号)可以替代零个或多个单词。
Q1:绑定的一个路由键是由三个单词组成的字符串,其中中间是单词为orange(*.orange.*)
Q2:绑定的两个路由键:
第一个是由三个单词组成的字符串,其中最后一个单词是rabbit(*.*.rabbit)
第二个是以lazy开头的多个单词的字符串(lazy.#)
根据以上的绑定关系,得到的数据接收情况如下:
quick.orange.rabbit                  被队列 Q1Q2 接收到
lazy.orange.elephant                被队列 Q1Q2 接收到
quick.orange.fox                      被队列 Q1 接收到
lazy.brown.fox                          被队列 Q2 接收到
lazy.pink.rabbit                         虽然满足两个绑定但只被队列 Q2 接收一次
quick.brown.fox                        不匹配任何绑定不会被任何队列接收到会被丢弃
quick.orange.male.rabbit          是四个单词不匹配任何绑定会被丢弃
lazy.orange.male.rabbit            是四个单词但匹配 Q2
PS:当队列绑定关系是下列这种情况时需要引起注意
当一个主题交换机的队列路由键是#,那么这个队列将接收所有数据,等同于 fanout 一样。
如果队列绑定键当中没有#*出现,那么该队列绑定类型就等同于direct 。
同理可得如果direct交换机,绑定的队列的路由键都是同一个,那direct交换机也等同于fanout。
绑定代码:
//连接Channel
Channel channel = RabbitMqUtils.getChannel();
//定义交换机的名称和类型
channel.exchangeDeclare(EXCHANGE_NAME, "topic");
//交换机绑定队列(方法的参数分别为:队列名、交换机名、路由键)
String QueueName1 = "Q1";
String QueueName2 = "Q2";
channel.queueBind(QueueName1, EXCHANGE_NAME, "*.orange.*");
channel.queueBind(QueueName2, EXCHANGE_NAME, "*.*.rabbit");
channel.queueBind(QueueName2, EXCHANGE_NAME, "lazy.#");
测试Map:
Map<String, String> bindingKeyMap = new HashMap<>();
bindingKeyMap.put("quick.orange.rabbit","被队列 Q1Q2 接收到");
bindingKeyMap.put("lazy.orange.elephant","被队列 Q1Q2 接收到");
bindingKeyMap.put("quick.orange.fox","被队列 Q1 接收到");
bindingKeyMap.put("lazy.brown.fox","被队列 Q2 接收到");
bindingKeyMap.put("lazy.pink.rabbit","虽然满足两个绑定但只被队列 Q2 接收一次");
bindingKeyMap.put("quick.brown.fox","不匹配任何绑定不会被任何队列接收到会被丢弃");
bindingKeyMap.put("quick.orange.male.rabbit","是四个单词不匹配任何绑定会被丢弃");
bindingKeyMap.put("lazy.orange.male.rabbit","是四个单词但匹配 Q2");

结果:

发布信息:

队列Q1接收到的信息:

队列Q2接收到的信息:

CYSWAN~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值