RabbitMQ学习总结(6)——消息的路由分发机制详解

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一、Routing(路由) (using the Java client)

在前面的学习中,构建了一个简单的日志记录系统,能够广播所有的日志给多个接收者,在该部分学习中,将添加一个新的特点,就是可以只订阅一个特定的消息源,也就是说能够直接把关键的错误日志消息发送到日志文件保存起来,不重要的日志信息文件不保存在磁盘中,但是仍然能够在控制台输出,那么这便是我们这部分要学习的消息的路由分发机制。

二、Bindings(绑定)

在前面的学习中已经创建了绑定(bindings),代码如下:
  channel.queueBind(queueName, EXCHANGE_NAME, "");    

一个绑定就是一个关于exchange和queue的关系,它可以简单的被理解为:队列是从这个exchange中获取消息的。

绑定可以采取一个额外的routingKey的参数,为了避免与basicPublish参数冲突,称之为一个绑定Key,这是如何创建一个带routingKey的绑定的关键。

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

一个绑定Key依赖于exchange的类型,像之前使用fanout类型的exchange,完全忽略了该绑定key的值。

三、Direct exchange(直接交换机)


前面实现的日志记录系统中广播所有的消息给所有的消费者,现在对其进行扩展,允许根据信息的严重程度来对消息进行过滤,比如,希望一个程序写入到磁盘的日志消息只接收错误的消息,而不是浪费磁盘保存所有的日志消息。

为了实现这个目标,使用一个fanout类型的exchange,显然是不能够满足这样的需求的,因为它只能广播所有的消息。

为此将使用一个direct exchange来代替fanout exchange,direct exchange使用简单的路由算法,将消息通过绑定的Key匹配将要到达的队列。

从上面的结构图中可以看出direct exchange X绑定着两个queue(Q1,Q2),第一个queue绑定的routingKey为orange,第二个有两个routingKey被绑定,一个routingKey为black,另外一个routingKey为green.

说明:发送带有routingKey为orange的消息到X(exchange)中,X将该消息路由到Q1中,发送带有routingKey为black和green的消息都将被路由到Q2中,其他所有消息将会被丢弃。

四、Multiple bindings(多绑定)

多个队列绑定相同的routingKey是允许的,在上述实例中,可以把X和Q1用routingKey:black绑定起来,这种情况下,direct exchange将像fanout类型的exchange一样会将消息广播都到所有匹配的queues中,即一个routingKey为black的消息将会被发送到Q1和Q2中。

五、Emitting logs(发送的日志)

使用direct代替fanout类型的exchange,发送消息到一个direct exchange中,将根据消息的重要程度作为routingKey,这样接收程序能够选择它想要接收的日志信息,首先必须先创建一个exchange.
    channel.exchangeDeclare(EXCHANGE_NAME, "direct");

其次,发送一条信息:
   channel.basicPublish(EXCHANGE_NAME, severity, null, message.getBytes());
为了简化程序,将severity设定为info、warning、error三种类型中的一种。

六、Subscribing(订阅消息)

接收者根据自己感兴趣的severity来创建一个新到的绑定。
String queueName = channel.queueDeclare().getQueue();for(String severity : argv){    channel.queueBind(queueName, EXCHANGE_NAME, severity);
}

七、Putting it all together(代码实现)

EmitLogDirect.java代码清单如下:


[java] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
public class EmitLogDirect {          private static final String EXCHANGE_NAME = "direct_logs";          public static void main(String[] argv)                     throws java.io.IOException {              ConnectionFactory factory = new ConnectionFactory();           factory.setHost("localhost");           Connection connection = factory.newConnection();           Channel channel = connection.createChannel();              channel.exchangeDeclare(EXCHANGE_NAME, "direct");              String severity = getSeverity(argv);           String message = getMessage(argv);              channel.basicPublish(EXCHANGE_NAME, severity, null, message.getBytes());           System.out.println(" [x] Sent '" + severity + "':'" + message + "'");              channel.close();           connection.close();       }       //..   }  

ReceiveLogsDirect代码 清单如下:
[java] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
public class ReceiveLogsDirect {          private static final String EXCHANGE_NAME = "direct_logs";          public static void main(String[] argv)                     throws java.io.IOException,                     java.lang.InterruptedException {              ConnectionFactory factory = new ConnectionFactory();           factory.setHost("localhost");           Connection connection = factory.newConnection();           Channel channel = connection.createChannel();              channel.exchangeDeclare(EXCHANGE_NAME, "direct");           String queueName = channel.queueDeclare().getQueue();              if (argv.length < 1){               System.err.println("Usage: ReceiveLogsDirect [info] [warning] [error]");               System.exit(1);           }              for(String severity : argv){               channel.queueBind(queueName, EXCHANGE_NAME, severity);           }              System.out.println(" [*] Waiting for messages. To exit press CTRL+C");              QueueingConsumer consumer = new QueueingConsumer(channel);           channel.basicConsume(queueName, true, consumer);              while (true) {               QueueingConsumer.Delivery delivery = consumer.nextDelivery();               String message = new String(delivery.getBody());               String routingKey = delivery.getEnvelope().getRoutingKey();                  System.out.println(" [x] Received '" + routingKey + "':'" + message + "'");           }       }   }  
	编译和往常一样(参见以往教程用于编译和类路径的建议)。现在,为了方便起见,我们将使用一个环境变量$CP(%CP%在Windows上)的运行时类路径的例子。
如果你只想保存 “警告”和“错误”(而不是“信息”)日志消息到一个文件,打开一个控制台和type:

[*] Waiting for logs. To exit press CTRL+C

[x] Sent 'error':'Run. Run. Or it will explode.'
$ java -cp $CP ReceiveLogsDirect warning error > logs_from_rabbit.log
$ java -cp $CP ReceiveLogsDirect info warning error
$ java -cp $CP EmitLogDirect error "Run. Run. Or it will explode."

转载于:https://my.oschina.net/zhanghaiyang/blog/594446

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kaggle爆文:一个框架解决几乎所有机器学习问题

上周一个叫 Abhishek Thakur 的数据科学家&#xff0c;在他的 Linkedin 发表了一篇文章 Approaching (Almost) Any Machine Learning Problem&#xff0c;介绍他建立的一个自动的机器学习框架&#xff0c;几乎可以解决任何机器学习问题&#xff0c;项目很快也会发布出来。 这篇…

C# HttpWebRequest GET HTTP HTTPS 请求

这个需求来自于我最近练手的一个项目&#xff0c;在项目中我需要将一些自己发表的和收藏整理的网文集中到一个地方存放&#xff0c;如果全部采用手工操作工作量大而且繁琐&#xff0c;因此周公决定利用C#来实现。在很多地方都需要验证用户身份才可以进行下一步操作&#xff0c;…

Mysql学习总结(4)——MySql基础知识、存储引擎与常用数据类型

2019独角兽企业重金招聘Python工程师标准>>> 1、基础知识 1.1、数据库概述 简单地说&#xff1a;数据库&#xff08;Database或DB&#xff09;是存储、管理数据的容器&#xff1b;严格地说&#xff1a;数据库是“按照某种数据结构对数据进行组织、存储和管理的容器”…

django权限二(多级菜单的设计以及展示)

多级权限菜单设计级标题栏 我们现在只有数据展示,要进入其他url还需要手动的输入路径,非常的麻烦,所以我们要设计 一个导航栏以及侧边多级菜单栏,这个展示是通过stark组件的设计的增删改查页面,而 每一个 页面我们都需要有导航栏和侧边的权限菜单栏,所以把这个公共的部分提起到…

腾讯手游如何提早揭露游戏外挂风险?

目前腾讯SR手游安全测试限期开放免费专家预约&#xff01;点击链接&#xff1a;手游安全测试立即预约&#xff01; 作者&#xff1a;sheldon&#xff0c;腾讯高级安全工程师 商业转载请联系腾讯WeTest获得授权&#xff0c;非商业转载请注明出处。 文中动图无法显示&#xff0c…

下面介绍一个开源的OCR引擎Tesseract2。值得庆幸的是虽然是开源的但是它的识别率较高,并不比其他引擎差劲。网上介绍Tessnet2也是当时时间排名第三的识别引擎,只是后来慢慢不维护了,目前是G

下面介绍一个开源的OCR引擎Tesseract2。值得庆幸的是虽然是开源的但是它的识别率较高&#xff0c;并不比其他引擎差劲。网上介绍Tessnet2也是当时时间排名第三的识别引擎&#xff0c;只是后来慢慢不维护了&#xff0c;目前是Google在维护&#xff0c;大家都知道Google 在搞电子…

分UV教程

第一步 首先&#xff0c;打开一个练习场景“空中预警机1.max”&#xff08;这事小弟平时的练习做的不好献丑了&#xff09;。&#xff08;图01&#xff09; 图01 第二步 这里我们拿机翼来举例子&#xff0c;隐藏除机翼意外的其他模型。&#xff08;图02&#xff09; 图02 第三步…

k8s系列--- dashboard认证及分级授权

http://blog.itpub.net/28916011/viewspace-2215214/ 因版本不一样&#xff0c;略有改动 Dashboard官方地址&#xff1a; https://github.com/kubernetes/dashboard dashbord是作为一个pod来运行&#xff0c;需要serviceaccount账号来登录。 先给dashboad创建一个专用的认证信息…

JAVA项目开发

16年java软件开发经验&#xff0c;全职项目开发&#xff0c;项目可签合同、开普票和专票。 主要承接项目&#xff1a; 1、网站开发项目 自主开发千帆CMS动态发布系统&#xff0c;基于java/springboot2/jpa/easyui开发&#xff0c;简单易用&#xff0c;后台与前端分离&#xff0…

unity3d 任务头上的血条

人物的名称与血条的绘制方法很简单&#xff0c;但是我们需要解决的问题是如何在3D世界中寻找合适的坐标。因为3D世界中的人物是会移动的&#xff0c;它是在3D世界中移动&#xff0c;并不是在2D平面中移动&#xff0c;但是我们需要将3D的人物坐标换算成2D平面中的坐标&#xff0…

unity3d 预制体

首先要说明一下什么是预制体&#xff1f; 在Unity3D里面我们叫它Prefab&#xff1b;我们也可以这样理解&#xff1a;当制作好了游戏组件&#xff08;场景中的任意一个gameobject &#xff09;,我们希望将它制作成一个组件模版&#xff0c;用于批量的套用工作&#xff0c;例如说…

Python小数据池,代码块

今日内容一些小的干货 一. id is 二. 代码块三. 小数据池四. 总结python小数据池&#xff0c;代码块的最详细、深入剖析 一. id is 二. 代码块三. 小数据池四. 总结一&#xff0c;id&#xff0c;is&#xff0c; 在Python中&#xff0c;id是什么&#xff1f;id是内存地址…

【Wax】使用Wax (framework方式,XCode 4.6)

前情提示&#xff1a;【Wax】使用Wax &#xff08;非framework方式&#xff0c;XCode 4.6&#xff09; 这次&#xff0c;将以framework的方式来使用Wax 那么&#xff0c;让我们开始吧&#xff01;&#xff01;&#xff01; 准备工作&#xff1a; 下载wax.framework&#xff1a;…

unity3d 简单动画

1&#xff0c;动画系统配置 创建游戏对象并添加Animation组件&#xff0c;然后将动画文件拖入组件。 进入动画文件的Debug属性面板 选中Legacy属性 选中游戏对象&#xff0c;打开Animation编辑窗口 添加动画变化属性 需改关键帧的属性值 配置完成后运行即可得到动画效果 2&…

3dmax导出到unity3d下分割动画

1、在3dmax 导出时候&#xff0c;要导出FBX文件&#xff0c;同时包含动画&#xff0c;骨骼&#xff0c;皮肤等内容 2、把FBX文件导入到Unity3d后会默认有一个超长的大动画&#xff0c;就是一个整体的动画&#xff0c;如图Take001&#xff0c;这个时候要分割哪部分是跑&#xf…

Unity3d之AssetBundle打包与读取

一、创建Assetbundle 在unity3d开发的游戏中&#xff0c;无论模型&#xff0c;音频&#xff0c;还是图片等&#xff0c;我们都做成Prefab&#xff0c;然后打包成Assetbundle&#xff0c;方便我们后面的使用&#xff0c;来达到资源的更新。 一个Assetbundle可以打包一个模型&…

unity3d 各个目录的意思

1.首先&#xff0c;你得理解Unity中各个目录的意思&#xff1f; 我这里说的是移动平台&#xff08;安卓举例&#xff09;&#xff0c;读&#xff0c;写。所谓读&#xff0c;就是你出大版本的包之后&#xff0c;这个只读的话&#xff0c;就一辈子就这些东西了&#xff0c;不会改…

asp.net core根据用户权限控制页面元素的显示

asp.net core根据用户权限控制页面元素的显示 Intro 在 web 应用中我们经常需要根据用户的不同允许用户访问不同的资源&#xff0c;显示不同的内容&#xff0c;之前做了一个 AccessControlHelper 的项目&#xff0c;就是解决这个问题的。 asp.net core 支持 TagHelper 和 基于 …

Java面向对象(二)

source:http://blog.java1234.com/index.html?typeId1 Java类的继承 1&#xff0c;继承定义以及基本使用 定义&#xff1a;子类能够继承父类的属性和方法&#xff1b; 注意点&#xff1a;Java中只支持单继承&#xff1b; 私有方法不能继承&#xff1b; 2&#xff0c;方法重写 …

游戏通讯方式

农药自从上线以来&#xff0c;依靠着强大的产品力以及腾讯的运营能力&#xff0c;在游戏市场上表现可谓是风生水起&#xff0c;根据第三方的调研数据显示&#xff0c;《王者荣耀》渗透率达到22.3%&#xff0c;用户规模达到2.01亿人&#xff0c;每日的日活跃用户&#xff08;DAU…