RabbitMQ-从基础到实战(4)— 消息的交换(下)
0.目录
RabbitMQ-从基础到实战(1)— Hello RabbitMQ
1.简介
本章节和官方教程相似度较高,英文好的可以移步官方教程
在上一章的例子中,我们创建了一个消费者,生产日志消息,广播给两个消费者,对消息进行不同的处理。这一节,我们将对它进行扩展,实现一些更加高级的功能,例如:使消费者A只接受error级别的日志保存到硬盘,消费者B接收所有级别的消息进行打印。
本文中涉及到的所有概念(包括前面几章),都将摒弃个人经验,以官方文档为基础进行讲解,在书写本文的同时,也是我对RabbitMQ的重新学习。
2.绑定
回顾一下上一章的队列绑定代码
// 把刚刚获取的队列绑定到logs这个交换中心上,
channel.queueBind(queueName, "logs", "");
这段代码在消费者中,为什么生产者没有?因为在RabbitMQ中消息是发送到交换中心(exchange)的,这在上一张已经重点强调过。
上述代码可以理解成,queueName这个队列对logs这个exchange中的消息感兴趣,routingKey是""
在发送消息的basicPublish方法中,也有一个参数叫做routingKey,没错,他们是有关联的,下面会介绍
在不同的exchange类型中,routingKey扮演的角色也相应的不同,比如上一章我们使用的fanout(扇出,多贴切的名字,想象一下WOW中盗贼的刀扇)将忽略routingKey,所有绑定在fanout类型的exchange上的队列,都将接收到该exchange上的所有消息。
3.Direct Exchange
fanout类型的exchange没有给我们太多的灵活性,direct类型的echange非常简单,会匹配消息发布时的routingKey和queue的routingKey,完全相等则把消息放入该队列。

如上图,Q1绑定了orange,Q2绑定了black和green,就可以实现不同级别的日志用不同的消费者进行处理
我们看到Q2绑定了两个routingKey,难道第二次绑定不会把第一次绑定覆盖掉吗?
实践出真正,我们来试一下

- 声明一个名为logs的exchange,类型换为direct,让它通过routingKey的完全匹配去分发消息
- 然后把消息发送到名为exchange上,routingKey是外面传进来的
改造一下发送方法,轮流发送info和error信息

给Consummer队列绑定两个routingKey

激动人心的时刻到来了,跑一把
Duang,报错了

报错信息:
inequivalent arg 'type' for exchange 'logs' in vhost '/': received 'direct' but current is 'fanout', class-id=40, method-id=10)
大意就是logs exchange已经被声明称fanout了,不能再声明成direct类型,RabbitMQ的队列声明方法和exchange声明方法都是幂等的,如果没有,就创建,如果有,参数相同,就不管,如果有了还用不同的参数重新声明,就报错
进入RabbitMQ控制台把logs删除,重新执行

逆袭成功,消费一下看看

成功了,一个队列可以绑定多个routingKey,这里注意先启动消费者,因为前面的代码里我们用的是临时队列,断开连接后,队列就删除了,如果先启动生产者,exchange接到消息后发现没有队列对它感兴趣,就任性的把消息给丢掉了。
一个队列可以绑定多个routingKey,反之,一个routingKey也可以绑定多个队列,如下图,感兴趣的朋友可以自己试一下

如果绑定在一个direct类型的exchange上的队列都使用同一个routingKey,那它就是一个fanout
4.结束语
这一章内容较少,主要是介绍了RabbitMQ中direct类型的exchange,下一章将跟着官方教程的进度继续介绍topic类型的exchange,以及下下章介绍用RabbitMQ实现RPC调用。之后则会介绍RabbitMQ与Spring的集成等与真实开发环境更相关的技术。
RabbitMQ-从基础到实战(4)— 消息的交换(下)的更多相关文章
- RabbitMQ-从基础到实战(3)— 消息的交换
1.简介 在前面的例子中,每个消息都只对应一个消费者,即使有多个消费者在线,也只会有一个消费者接收并处理一条消息,这是消息中间件的一种常用方式.还有另外一种方式,生产者生产一条消息,广播给所有的消费者 ...
- RabbitMQ-从基础到实战(2)— 防止消息丢失
转载请注明出处 1.简介 RabbitMQ中,消息丢失可以简单的分为两种:客户端丢失和服务端丢失.针对这两种消息丢失,RabbitMQ都给出了相应的解决方案. 2.防止客户端丢失消息 如图,生产者P向 ...
- RabbitMQ-从基础到实战(5)— 消息的交换(下)
转载请注明出处 0.目录 RabbitMQ-从基础到实战(1)- Hello RabbitMQ RabbitMQ-从基础到实战(2)- 防止消息丢失 RabbitMQ-从基础到实战(3)- 消息的交换 ...
- RabbitMQ-从基础到实战(3)— 消息的交换(上)
转载请注明出处 0.目录 RabbitMQ-从基础到实战(1)— Hello RabbitMQ RabbitMQ-从基础到实战(2)— 防止消息丢失 RabbitMQ-从基础到实战(4)— 消息的交换 ...
- RabbitMQ-从基础到实战(6)— 与Spring集成
0.目录 RabbitMQ-从基础到实战(1)- Hello RabbitMQ RabbitMQ-从基础到实战(2)- 防止消息丢失 RabbitMQ-从基础到实战(3)- 消息的交换(上) Rabb ...
- RabbitMQ消息的交换
消息的交换 目录 RabbitMQ-从基础到实战(1)— Hello RabbitMQ RabbitMQ-从基础到实战(2)— 防止消息丢失 1.简介 在前面的例子中,每个消息都只对应一个消费者,即使 ...
- RabbitMQ-从基础到实战(1)— Hello RabbitMQ
转载请注明出处 1.简介 本篇博文介绍了在windows平台下安装RabbitMQ Server端,并用JAVA代码实现收发消息 2.安装RabbitMQ RabbitMQ是用Erlang开发的,所以 ...
- C# RabbitMQ延迟队列功能实战项目演练
一.需求背景 当用户在商城上进行下单支付,我们假设如果8小时没有进行支付,那么就后台自动对该笔交易的状态修改为订单关闭取消,同时给用户发送一份邮件提醒.那么我们应用程序如何实现这样的需求场景呢?在之前 ...
- RabbitMQ的基础介绍
转自:http://blog.csdn.net/whycold/article/details/41119807 一.引言 你是否遇到过两个(多个)系统间需要通过定时任务来同步某些数据?你是否在为异构 ...
随机推荐
- Windows 10 IoT Serials 4 - 如何在树莓派上使用Cortana语音助手
从Windows 10 IoT Core 14986版本开始,微软已经加入Cortana语音助手功能.之前,我们只能使用本地语音识别,需要编写应用程序,下载到设备中才能实现.从现在开始,微软已经从系统 ...
- SQL2012还原数据库操作在本地服务器上操作和用别的电脑远程连接到服务器进行操作的文件路径差异
在数据库服务器上想还原一个数据库到某个备份文件时期的,服务器的数据库文件本身是保存在 D:\DEVDB目录 通过开发电脑上的MS manager来连接数据库服务器操作还原 虽发现文件卡项上,原始文件名 ...
- [笔记]FTRL与Online Optimization
1. 背景介绍 最优化求解问题可能是我们在工作中遇到的最多的一类问题了:从已有的数据中提炼出最适合的模型参数,从而对未知的数据进行预测.当我们面对高维高数据量的场景时,常见的批量处理的方式已经显得力不 ...
- 初识markdown以及markdown的常用语法
一直都听说markdown可以写作变得更加方便,但是总没有去了解一下,今天下载了一个markdown编辑器,感受了一下markdown的魅力,发现对于程序员写博客之类的,markdown带来了很大 ...
- 模仿jquery的fileupload插件
仅需要new一个对象,将上传后台的url和点击触发上传的元素id传给对象,就可以自从实现上传 暂不支持IE <html> <body> <a href="#&q ...
- matlab 自定义函数及调用
这一篇博客主要学习了: 第一,自定义函数优点有很多,比如可重复利用:容易纠错,以后直接装入大工程里(更重要的是,实参是复制给形参的,在自定义函数中运行时形参独立显示,这一点和C不一样). 第二,通过h ...
- bootstrap 字体图标
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- web移动端Fixed在Input获取焦点时ios下产生的BUG及处理
1.现象 可以看到下面两张图,图1搜索框为fixed固定在顶部,滚动没有任何问题. 图2当光标进入搜索框时,ios自作聪明的把光标定位到中间,并且fixed属性被自动修改成了absolute.此时注意 ...
- 360随身wifi无法使用临时解决方案大全
360随身wifi在绝大多数情况下都是可以正常使用的,但在极少数系统或网络环境下可能会出现异常,如系统服务缺失.公司网络限制.少数校园网客户端限制等等: 360攻城师正在积极努力解决 ...
- C#推送RTMP到SRS通过VLC进行取流播放!!
前面一篇文章简单的介绍了下如何利用SRS自带的播放地址进行观看RTMP直播流,也就是说是使用SRS的内置demo进行Test,但是进行视频直播肯定不可能使用那样的去开发,不开源的东西肯定不好用.由于在 ...