当前位置: 首页 > 编程日记 > 正文

RabbitMQ入门(4)--路由

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

###路由 ###(使用Java客户端) 在先前的指南中,我们建立了一个简单的日志系统。我们可以将我们的日志信息广播到多个接收者。 在这部分的指南中,我们将要往其中添加一个功能-让仅仅订阅一个消息的子集成为可能。例如,我们可以直接将关键的错误信息指向到日志文件(保存在爱硬盘空间),同时依旧能打印所有日志信息到平台上。

###绑定

在之前的例子里我们已经创建绑定。你可以回顾下代码:

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

A binding is a relationship between an exchange and a queue. This can be simply read as: the queue is interested in messages from this exchange. 一个绑定是一个交换所和一个队列之间的关系。这个很容易理解为:这个队列是对这 交换机的消息感兴趣。

绑定可以带上额外的路由关键字参数。为了消除对basic_publish参数的迷惑,我们将会将它称之为绑定关键字。以下是我们如何通过一个关键字创建一个绑定:

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

这绑定关键字的意义取决于 交换机类型。这fanout 交换机,我们之前使用的那个,仅仅忽略它的值。

###直接交换 我们当前的日志系统将所有消息广播到所有消费者。我们想扩展它,让其允许依据其严格的规则过滤消息。例如我们可能想让一个往硬盘中写日志消息的程序仅仅接收关键的错误,而不是将硬盘空间浪费在警告和信息的日志消息上。 我们使用fanout类型的交换机,那个不会给我们太多的灵活性-它仅仅能胜任没头脑的广播。

我们可以使用direct类型的交换机来替代。一个direct交换机背后的路由算法是简单的-一个消息将会进入那些队列的绑定关键字与消息中路由关键字匹配的队列中。

为了说明那个,考虑接下来结构: direct-exchange.png 在这个结构里,我们看见了这direct类型的交换机绑定了两个队列。第一个队列装有orange绑定关键字,这第二个有两个绑定,一个是black绑定关键字并且另一个是green关键之。 在这个结构里,发送到交换机里的消息,其中消息中带路由关键字为orange将要路由到队列Q1上,消息中带路由关键字为blackgreen将路由到队列Q2上。所有其他类型的消息会被丢弃。 ###多种绑定 direct-exchange-multiple.png 将一个绑定关键字绑定到货个队列上是十分合法的。在我们例子中使用绑定关键字blackXQ1绑定在一起。既然那样,这direct类型的交换机与fanout类型相似,同样会广播这消息到所有符合的队列中。一个路由关键位balck的关键字将会被传递到Q1Q2。 ###发出日志 我们将会为我们的日志系统使用这个模型。使用direct类型的交换机来代替fanout类型,发送消息。由于这路由关键字我们可以严格的记录。接收程序通过这种方式可以严格接收它想接收的。让我们首先关注发布日志。 总之,我们首先需要创建个交换机。

channel.exchangeDeclare(EXCHANGE_NAME, "direct");

我们准备发送一个消息:

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

为了简化这个事情,我们保证这severityinof,warning,error中的一个。 ###订阅 接收消息如先前那样工作,有一个例外,我们会把每一个我们感兴趣的severity创建一个新的绑定。

String queueName = channel.queueDeclare().getQueue();for(String severity : argv){    channel.queueBind(queueName, EXCHANGE_NAME, severity);
}

###把它们放在一起 python-four.pngEmitLogDirect.java类的代码:

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类的代码:

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(在windows环境上是%CP%)表示类路径。 如果你想仅保存warningerror记录不包含info记录信息到文件里,打开一个控制平台并输入:

$ java -cp $CP ReceiveLogsDirect warning error > logs_from_rabbit.log

如果你想在你的屏幕上看所有的日志信息,打开一个新的终端并键入:

$ java -cp $CP ReceiveLogsDirect info warning error[*] Waiting for logs. To exit press CTRL+C

例如,为了发布一个错误日志信息,仅需要键入:

$ java -cp $CP EmitLogDirect error "Run. Run. Or it will explode."[x] Sent 'error':'Run. Run. Or it will explode.'

EmitLogDirect.java source和ReceiveLogsDirect.java source的所有源代码。

阅览指南第五部分,查看如何根据一个模式来监听消息。

转载于:https://my.oschina.net/OpenSourceBO/blog/379737

相关文章:

从一个数组中寻找出现奇数次的数字

假设给定了数组nums为[0,1,2,3,4,5,6,7,8,9,10,10,9,8,7,6,5,4,1,2,3,3,0] 其中3出现了3次 而其他数字都出现了两次 则我们应该得到结果为3 第一种方式&#xff1a;使用Hash 1 /**2 * 使用hash3 * */4 public static int singleNumber_1(int[] nums) {5 …

Blender写实建筑场景制作学习教程 Exterior Visualization in Blender 2.9

MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |时长:26节课(3h 41m) |大小:3.3 GB 使用Blender创建惊人的外部渲染。 你会学到: Blender中的建模、着色…

Postman增删改查接口测试

查 一.选择Get方式 二.点击Send开始测试&#xff0c;得出结果 增 一.选择Post方式 二.输入需要增添的数据 三.点击Send测试 四.没有报错&#xff0c;添加成功 查看一下&#xff0c;发现确实添加进去了 删 一.选择Delete方式 二.根据id删除&#xff0c;在请求路径下直接写出…

新安装Ubuntu加载时提示“为/检查磁盘时发生严重错误”的解决方法

本文部分内容转载自&#xff1a; http://jingyan.baidu.com/article/0aa22375bbffbe88cc0d6419.html http://www.aichengxu.com/view/35086 解决方法&#xff1a; 1. 进入Ubuntu启动菜单时按e 键进入启动项编辑模式&#xff1a; 2. 找到代码【ro rootflagsync】&#xff0c;将其…

android binder机制之——(创建binder服务)

Binder机制编程前面的几篇文章具体介绍了android中binder机制的方方面面&#xff0c;相信你对binder机制已经有了较深刻的理解。俗话说得好“学以致用”&#xff0c;以下我们就通过在android系统中创建一个我们自己的binder服务&#xff0c;来加深对binder机制的理解。&#xf…

通过NSProxy来解决NSTimer使用不当造成内存泄漏的问题

NSTimer的一般使用: 1 interface ViewController : UIViewController2 property (nonatomic, strong) NSTimer *timer;3 end4 5 implementation ViewController6 - (void)viewDidLoad {7 [super viewDidLoad];8 [self startTimer];9 } 10 11 - (void)startTimer { 12 …

Blender 2.9中的真实感三维产品全流程制作学习教程

MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |时长:41节课(6h 23m) |大小:5.83 GB 含课程文件 使用blender 2.9建模、纹理、光照和渲染真实的吉他 …

SpringBoot中的SFL4J日志

SpringBoot&#xff1a;底层是Spring框架&#xff0c;Spring框架默认使用的是JCL日志的抽象层 SpringBoot选用SLF4J和logback 如何系统地在系统中使用SLF4J 在开发的使用&#xff0c;日志记录方法的调用&#xff0c;不应该来直接调用日志的实现类&#xff0c;而是调用日志抽象…

web开发性能优化---用户体验篇

怎样从技术角度怎样增强用户体验。都是非常多平台都在做的事情&#xff0c;依据个人实际经验碰到几种体验做下总结。1、降低页面刷新白屏适当使用ajax技术。改善刷新白屏现象。2、信息提醒&#xff0c;邮件、站内信、短信在购物流程、售后流程适当添加信息温馨提醒环节&#xf…

linux命令2--cd和pwd

2019独角兽企业重金招聘Python工程师标准>>> cd是linux中最为常见的一个命令&#xff0c;其作用就是切换到某一个路径下 例子1 到自己的用户目录下 cd ~ 也可以直接cd 例子2 返回进入当前目录之前的目录 cd - 例子3 把上一个命令作为cd的参数命令 cd !$ 参考文档&am…

COALESCE语句解救sql的sum问题

mysqlmybatis有一个sql语句是统计用的 <select id"getNum" resultType"map"> 结果是一个map&#xff0c; select语句的结果是一些sum select sum(t.anum),sum(t.bnum)from tableSum twhere t.id #{id} 调试发现&#xff0c;数据库明明记录已经落入&…

在UE5创造一个多山的松树森林场景学习教程

UE5游戏场景设计制作视频教程 大小解压后&#xff1a;4.37G 1920X1080 mp4 语言&#xff1a;英语中英字幕&#xff08;机译&#xff09;时长&#xff1a;5小时 20分 课程获取&#xff1a;在UE5创造一个多山的松树森林场景学习教程

编写纳新网站后端的相关知识总结

使用HSSFWorkbook导出数据库中的数据 导入Apache POI Maven jar包 <!-- Apache POI --> <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.6</version> </dependency>在控制层编…

IOSUIcontrol事件

UIKit提供了一组控件&#xff1a;UISwitch开关、UIButton按钮、UISegmentedControl分段控件、UISlider滑块、UITextField文本字段控件、UIPageControl分页控件。 控件是对UIView派生类的实用增强及补充&#xff0c;并可以直接附着于导航栏、表格单元&#xff0c;甚至更大的对象…

Xcode Debugging

程序员日常开发中有大量时间都会花费在 debug 上&#xff0c;从事 iOS 开发不可避免地需要使用 Xcode。这篇博客就主要介绍了 Xcode 中几种能够大幅提升代码调试效率的方式。“If debugging is the process of removing bugs, then programming must be the process of putting…

css小技巧 -- 单标签实现单行文字居中,多行文字居左

可能出现的尺寸场景: 代码如下&#xff1a; <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv&q…

Unity游戏开发大师班

大小解压后&#xff1a;8.63G 持续时间19h 包含项目文件 1280X720 MP4 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; Unity游戏开发大师班 信息: 要求 –没有课程要求&#xff0c;展示了开发过程的每一步(包括解释的每一行代码) 这门课…

GC处理的分析

GC处理的深入分析 在Java中针对垃圾收集也提供了多种不同的处理分类 1.引用计数&#xff1a; 一个实例化对象&#xff0c;如果有程序使用了这个引用对象&#xff0c;引用计数加一&#xff0c;当一个对象使用完毕&#xff0c;引用计数减一&#xff0c;当引用计数为0时&#x…

2016.1.20 dubbo启动之后机器ip有问题

环境 100.0.4.222 zookerper 2182 100.0.4.221 dubbo 20871 1.问题 dubbo 对应的机器ip 是202.106.199.37 不是100.0.4.221 2.解决 说明 主机名有问题 修改主机名 使之生效 重启zookeeper服务 和dubbo服务 搞定 转载于:https://www.cnblogs.com/huawei306/p…

在Eclipse或MyEclipse中安装findbugs插件

2019独角兽企业重金招聘Python工程师标准>>> 我们都知道&#xff0c;在Eclipse或MyEclipse中安装插件有两种方式&#xff0c;一种是在线安装&#xff0c;第二种是先下载插件然后在本地安装。 在这里我们先介绍第一种在线安装。 Eclipse上在线安装findbugs(具体步骤如…

Jboss解决只能通过localhost访问而不能使用IP访问项目的问题

jboss的配置文件&#xff0c;如 E:\downloadChrome\wildfly-10.1.0.Final\standalone\configuration\shandalone.xml <interfaces> <interface name"management"> <inet-address value"${jboss.bind.address.management:127.0.0.1}"/>…

一.JDBC概述

第1章&#xff1a;JDBC概述 1.1 数据的持久化 持久化(persistence)&#xff1a;把数据保存到可掉电式存储设备中以供之后使用。大多数情况下&#xff0c;特别是企业级应用&#xff0c;数据持久化意味着将内存中的数据保存到硬盘上加以”固化”&#xff0c;而持久化的实现过程大…

在Blender中创建惊人的低多边形动画

大小解压后&#xff1a;13.5G 持续时间10小时 包括项目文件 1920X1080 MP4 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; 标题:CGBoost学院–立方体世界在Blender中创建惊人的低多边形动画 信息: 创建漂亮的3D动画&#xff0c;就像玩乐高…

开发Eclipse自定义控件

摘自&#xff1a;http://www.ibm.com/developerworks/cn/opensource/os-eclipcntl/ 我们在开发自定义控件时主要考虑以下问题&#xff1a; 1、 自定义控件的绘制&#xff1a;通常我们需要自己对控件的形状或图案进行绘制&#xff1b; 2、 控件对键盘事件的响应&#xff1a;当焦…

小米手机无法连接eclipse调试案例

按照参考博客2的方法 小米2S手机在Eclipse真机调试时&#xff0c;设备选择列表无法显示手机&#xff0c;DDMS也连接不上设备&#xff0c;解决步骤&#xff1a; 1.打开手机设置中开发者选项 - USB调试开启&#xff1b; 2.保证小米2S手机Windows下设备驱动已安装&#xff0c;可…

手机号码格式验证和 FASTDFS 工具类

常见大陆和香港号码格式验证 import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException;public class PhoneFormatCheckUtils {// 大陆号码或香港号码均可public static boolean isPhoneLegal(String str) throws Patt…

Maya摄像机动画技能学习教程

MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |时长:4h 38m |大小解压后:1.65 GB 含课程文件 Maya的相机工具是所有3D包中最好的。在本课程中&#x…

前端解决跨域问题的8种方案(最新最全)

.同源策略如下&#xff1a; URL说明是否允许通信http://www.a.com/a.jshttp://www.a.com/b.js同一域名下允许http://www.a.com/lab/a.jshttp://www.a.com/script/b.js同一域名下不同文件夹允许http://www.a.com:8000/a.jshttp://www.a.com/b.js同一域名&#xff0c;不同端口不允…

IDEA中修改文件的默认创建方式

今天很手欠地在创建application-dev.yml文件的时候将application-dev这个名字的文件成功变成了一个我不认识的文件打开方式了&#xff0c;如下图&#xff1a; 可以看到&#xff0c;这个application-dev.yml文件从原来的SpringBoot的配置文件变成一个我们不认识的文件格式… 补…

ArcEngine 直连连接SDE

关键代码IPropertySet pPropertySet new PropertySetClass();pPropertySet.SetProperty("SERVER", sde.IpAdress);pPropertySet.SetProperty("INSTANCE", "sde:oracle11g$//" sde.IpAdress "/" sde.Instance); pPrope…