在上一节中我们创建了一个日志系统。实现将日志消息广播给所有的cusumer。

在这片教程中,我们将为日志系统添加一个功能:仅仅订阅一部分消息。比如:我们可以直接将关键的错误类型日志消息保存到日志文件中,还可以同时将所有的日志消息打印到控制台。

绑定(binding)

  在之前的例子中,我们已经创建了绑定:

  channel.queueBind(queueName,EXCHANGE_NAME,"");

  一个绑定是建立在一个队列和一个路由器之间的关系,可以解读为:该队列对这个路由器中的消息感兴趣。

  绑定可以设置另外的参数:路由键(routing key)。为了避免和producer中的void basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body)中的routingKey混淆,我们将这里的key称为绑定键binding key,下面的代码展示了如何使用绑定键来创建一个绑定关系:

  channel.queueBind(queueName,EXCHANGE_NAME,"black");

  绑定键的含义取决于路由器的类型,我们之前用的fanout类型交换机会忽略该值。

直接交换(Direct Exchange)

  我们之前的日志系统会将所有消息广播给所有消费者。现在我们想根据日志的严重程度来过滤日志。比如,我们想要一个程序来将error日志写到磁盘文件中,而不要将warning或info日志写到磁盘中,以免浪费磁盘空间。

  我们之前使用的fanout路由器缺少灵活性,它只是没头脑地广播消息。所以,我们用direct路由器来替换它。direct路由器背后的路由算法很简单:只有当消息的路由键routing key与队列的绑定键binding key完全匹配时,该消息才会进入该队列。

  直接交换机器x与两个队列绑定。第一个队列以绑定键orange来绑定,第二个队列以两个绑定键black和green和交换机绑定。 按照这种设置,路由键为orange的消息以发布给交换机后,将会被路由到队列Q1,路由键为black或者green的消息将会路由到队列Q2。

多重绑定(Multiple bindings)

  

  多个队列以相同的绑定键binding key绑定到同一个Exchange上,是完全可以的。按照这种方式设置的话,直接路由器就会像fanout路由器一样,将消息广播给所有符合路由规则的队列。一个路由键为black的消息将会发布到队列Q1和Q2。

发布消息

  我们使用direct来代替fanout,同时我们为日志设置严重级别,并将此作为路由键。这样,接受者就可以选择性的接受日志消息。

  首先,声明一个交换机

  channel.exchangeDeclare(EXCHANGE_NAME,“direct”);

  然后,发送一个消息

  channel.basicPublish(EXCHANGE_NAME,severity,null,message.getBytes());

  我们此处只设置一种severity。在info warning error中任选一种。

消息订阅

  String queueName = channel.queueDeclare().getQueue();

  for(String severity:argv){

    channel.queueBind(queueName,EXCHANGE_NAME,severity);

  }  

完整代码如下:

 生产者:

  

消费者:

  启动一个消费者实例(ReceiveLogDirect),将其要监听的级别改为String[] severity = {"error"},再启动另一个消费者实例。此时这两个消费者都开始监听了,一个监听所有级别的日志,另一个监听error日志。然后启动生产者,将info分别改为warning、error后启动。

  可看到如下输出:

  

  

Rabbitmq-direct演示的更多相关文章

  1. RabbitMQ direct类型的Exchange

    就目前来说,Exchange是与消息发送端有关的,因为它可以指定将消息发送到哪个或哪些队列中. 本篇文章介绍的direct类型就是指定将消息定向发送到哪个队列中. direct,顾名思义,就是直接的意 ...

  2. 初识RabbitMQ,附RabbitMQ+PHP演示实例

    RabbitMQ是一个在AMQP基础上实现的企业级消息系统.何谓消息系统,就是消息队列系统,消息队列是""消费-生产者模型""的一个典型的代表,一端往消息队列中 ...

  3. Rabbitmq -- direct

    一.前言 RabbitMQ还支持根据关键字发送,即:队列绑定关键字,发送者将数据根据关键字发送到消息exchange.direct类型的Exchange路由规则也很简单,它会把消息路由到那些bindi ...

  4. rabbitmq direct、fanout、topic 三种Exchange java 代码比较

    Producer端 1.channel的创建 无论是才用什么样的Exchange,创建channel代码都是相同的,如下 ConnectionFactory factory = new Connect ...

  5. springboot rabbitmq direct exchange和topic exchange 写法上关于路由键的区别

    这是direct exchange写法中消息发送写法,可见下图红色框中路由键是queue队列中定义的路由键 这是topic exchange写法中消息发送写法,可见下图红色框中路由键是exchange ...

  6. RabbitMQ direct交换器

    1:队列和交换器多次绑定 String[] routekeys={"routekey1","routekey2","routekey3"}; ...

  7. RabbitMQ学习之:(六)Direct Exchange (转贴+我的评论)

    From: http://lostechies.com/derekgreer/2012/04/02/rabbitmq-for-windows-direct-exchanges/ RabbitMQ fo ...

  8. RabbitMQ从零到集群高可用(.NetCore5.0) - RabbitMQ简介和六种工作模式详解

    一.RabbitMQ简介 是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,RabbitMQ是使用Erlang(高并发语言)语言来编写的,并且RabbitMQ是基于AMQ ...

  9. RabbitMQ、Redis

    进程QUEUE,可以是父进程与子进程间进行交互,也可以是同属于一个父进程的子进程间的交互:如果要实现进程A与进程B之间的通信,就需要借助一个中间进程了,我们习惯称为消息队列. QQ无法直接与WORD通 ...

  10. RabbitMQ消息队列(八)-通过Topic主题模式分发消息(.Net Core版)

    前两章我们讲了RabbitMQ的direct模式和fanout模式,本章介绍topic主题模式的应用.如果对direct模式下通过routingkey来匹配消息的模式已经有一定了解那fanout也很好 ...

随机推荐

  1. 【BI学习笔记】在Linux上安装Wyn Enterprise商业智能报表服务器

    在百度文库上找来的,放到这里,避免以后丢了. 葡萄城出品的Wyn Enterprise商业智能软件的设计器和查看视图是通过浏览器使用的,不需要安装专门的程序.Wyn Enterprise的服务器端可以 ...

  2. 微信小程序开发--路由切换,页面重定向

    这段时间开发了一个微信小程序,虽然小程序的导航API 官方文档写得很详细,但是在具体开发过程中还是会遇到很多不明白,或者一时转不过弯的地方. 1.页面切换传参,参数读取 1.1  wx.navigat ...

  3. springcloud 入门 9 (消息总线)

    Spring cloud bus: Spring cloud bus通过轻量消息代理连接各个分布的节点.这会用在广播状态的变化(例如配置变化)或者其他的消息指令.Spring bus的一个核心思想是通 ...

  4. 利用python实现简单词频统计、构建词云

    1.利用jieba分词,排除停用词stopword之后,对文章中的词进行词频统计,并用matplotlib进行直方图展示 # coding: utf-8 import codecs import ma ...

  5. 实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制

    记录一下,方便以后复制粘贴 // 方法一: Object.prototype.clone = function() { var o = this.constructor === Array ? [] ...

  6. MD5生成

    /// <summary> /// 32位MD5加密 /// </summary> /// <param name="input"></p ...

  7. s面向对象的写法

    js面向对象的写法 一.在html中引入该js文件,使用时: <script> var BuyBw8Product = new buyBw8Product(); </script&g ...

  8. VMware导入OVF时报错(未能部署OVF包用户取消了任务的解决办法)

    阅读目录: 1.问题 2.原因 3.解决方案 问题:部署OVF模版的时候报错“用户取消了任务” 原因:导出ovf模板时,虚拟CD-ROM的选项要选[客户端设备],否则导入时报错“用户取消了任务” 解决 ...

  9. JavaScript 中的匿名函数((function() {})();)与变量的作用域

    以前都是直接用前端框架Bootstrap,突然想看看Javascript,发现javascript是个非常有趣的东西,这里把刚碰到的一个小问题的理解做下笔录(废话不多说,上代码). /** * Exa ...

  10. Git命令实现本地文件推送到git仓库

    前提: ①确定本机(windows环境)已经安装git(https://git-scm.com/downloads) ②建立好远程Git仓库   1.在你想推送的文件夹下:右键→选择Git Bath ...