RBMQ发布和订阅消息
RBMQ发布和订阅消息
exchange
参考翻译自: RabbitMQ官网
生产者并非将消息直接发送到queue,而是发送到exchange中,具体将消息发送到特定的队列还是多个队列,或者是丢弃,取决于exchange的类型
exchange的类型
- direct
- topic
- headers
- fanout
bindings(绑定队列)
当生产/消费exchange时,可以绑定队列到exchange中:
channel.queueBind(queueName, EXCHANGE_NAME, "");
bind方法将一个队列和一个exchange绑定到一起,第三个参数 routing key,相当于描述这个绑定关系的key,会根据不同类型的exchange,来决定将消息发送到queue中,多个queue中,或者消费时,将消息递送到绑定的queue中
fanout类型
fanout将收到的所有消息发送到所有的已知队列中.
定义一个fanout类型的exchange
channel.exchangeDeclare("logs", "fanout");
发送消息到exchange中
channel.basicPublish( "logs", "", null, message.getBytes());
消费exchange
当我们消费一个fanout类型的exchange时,exchange发送消息到多个queue,而我们想要消费所有的queue,而不是其中一部分,而我们不知道消息具体被发送到哪个queue,也没法指定多个queue,此时需要一个临时queue
Temporary Queue
String queueName = channel.queueDeclare().getQueue();
这样定义了一个临时queue,这个队列非持久,消费者独有的,会被自动删除,当消费者断开连接时,临时queue自动被删除
为了告诉exchange发送消息到我们定义的临时queue,需要进行绑定操作:
channel.queueBind(queueName, "logs", "");
direct类型
生产队列
channel.queueBind(queueName, EXCHANGE_NAME, "black");
channel.queueBind(queueName1, EXCHANGE_NAME, "white");
当exchange为direct类型时,会将exchange和queuename绑定到一起绑定key为black,将exchange和queuename1绑定到一起,绑定key为white.fonout类型会忽略第三个参数,当发送消息时:
channel.basicPublish(EXCHANGE_NAME, "black", null, message.getBytes());
channel.basicPublish(EXCHANGE_NAME, "white", null, message1.getBytes());
此时,会将message发送到绑定的queuename队列中,message1发送到绑定的queuename1队列中.
绑定多个队列到一个binding key时,相当于广播,会将消息发送到多个队列中
消费队列
String queueName = channel.queueDeclare().getQueue();
for(String severity : argv){
channel.queueBind(queueName, EXCHANGE_NAME, severity);
}
当消费一个direct类型的exchange时,通过binding key 决定消费哪个队列
topic类型
有时候,我们需要发布/订阅消息有多个筛选类型,比如发布一个动物消息:移动速度,颜色,类别.当需要订阅所有同一个颜色的动物时,比如全部移动速度,黑色,所有类别.此时涉及到模糊匹配,使用fanout和direct类型不符合要求,此时要用到topic`类型
发布消息
channel.basicPublish(EXCHANGE_NAME, "quick.orange.rabbit", null, message.getBytes());
channel.basicPublish(EXCHANGE_NAME, "lazy.orange.elephant", null, message.getBytes());
发布了两个routing key,一个快,橙色,兔子,一个慢,橙色,大象,这两个routing key的消息发到了不同的队列中
消费消息
channel.queueBind(queueName, EXCHANGE_NAME, "*.orange.*");
通过绑定队列,到模糊匹配routing key上,当所有符合匹配规则的routing key的消息都会被消费者队列所消费
关于exchange的命令
列出exchanges
sudo rabbitmqctl list_exchanges
列出服务器上的exchanges,amq.*开头的exchange和default(没有名字)的exchange是默认创建的.一般不大可能直接使用.
未命名的exchange
未命名的exchange默认将消息分发给routingKey定义的名称的队列
RBMQ发布和订阅消息的更多相关文章
- Redis的高级应用-事务处理、持久化、发布与订阅消息、虚拟内存使用
三.事务处理 Redis的事务处理比较简单.只能保证client发起的事务中的命令可以连续的执行,而且不会插入其他的client命令,当一个client在连接 中发出multi命令时,这个连接就进入一 ...
- EasyNetQ使用(六)【多态发布和订阅,消息版本控制】
你能够订阅一个接口,然后发布基于这个接口的实现. 让我们看下一个示例.我有一个接口IAnimal和两个实现Cat和Dog: public interface IAnimal { string Name ...
- Redis 发布与订阅 消息
基于Redis消息队列-实现短信服务化 1.Redis实现消息队列原理 常用的消息队列有RabbitMQ,ActiveMQ,个人觉得这种消息队列太大太重,本文介绍下基于Redis的轻量级消息队列服务. ...
- JMS发布/订阅消息传送例子
前言 基于上篇文章"基于Tomcat + JNDI + ActiveMQ实现JMS的点对点消息传送"很容易就可以编写一个发布/订阅消息传送例子,相关环境准备与该篇文章基本类似,主要 ...
- Kafka是分布式发布-订阅消息系统
Kafka是分布式发布-订阅消息系统 https://www.biaodianfu.com/kafka.html Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apa ...
- 高吞吐量的分布式发布订阅消息系统Kafka--安装及测试
一.Kafka概述 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因 ...
- 分布式发布订阅消息系统 Kafka 架构设计[转]
分布式发布订阅消息系统 Kafka 架构设计 转自:http://www.oschina.net/translate/kafka-design 我们为什么要搭建该系统 Kafka是一个消息系统,原本开 ...
- 分布式发布订阅消息系统Kafka
高吞吐量的分布式发布订阅消息系统Kafka--安装及测试 一.Kafka概述 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动作(网页浏览, ...
- Kafka logo分布式发布订阅消息系统 Kafka
分布式发布订阅消息系统 Kafka kafka是一种高吞吐量的分布式发布订阅消息系统,她有如下特性: 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳 ...
随机推荐
- LR12中针对WebServices协议的三种脚本开发模式
一,webservices协议简介 webservices是建立可交互操作的分布式应用程序的新平台,它通过一系列的标准和协议来保证程序之间的动态连接, 其中最基本的协议包括soap,wsdl,uddi ...
- Sketchup (待续)
Sketchup插件 来自20个最好用的SketchUp插件 https://www.bilibili.com/video/av17242031/?from=search&seid=15336 ...
- Dubbo 泛化调用的参数解析问题及一个强大的参数解析工具 PojoUtils
排查了3个多小时,因为一个简单的错误,发现一个强大的参数解析工具,记录一下. 背景 Nodejs 通过 tether 调用 Java Dubbo 服务.请求类的某个参数对象 EsCondition 有 ...
- 三极管(如NPN)集电极正偏 发射极反偏会怎么样呢? 电流会倒流吗? 其他三种都知道,就是不知道这种情况
三极管除了你知道的放大,饱和和截止三种工作状态之外,还有一种用得极少的“倒置”工作状态,就是集电结正偏发射结反偏,这时跟对比放大状态的发射结正偏集电结反偏来理解,“倒置状态”的集电结,发射结分别充当了 ...
- redis 在 php 中的应用(Set篇)
本文为我阅读了 redis参考手册 之后编写,注意 php_redis 和 redis-cli 的区别(主要是返回值类型和参数用法) Redis的 Set 是 string 类型的无序集合.集合成员是 ...
- Linux学习笔记之Linux添加/删除用户和用户组
本文总结了Linux添加或者删除用户和用户组时常用的一些命令和参数. 1.建用户: adduser phpq //新建phpq用户 passwd phpq //给phpq用户设置密码 2.建工作组 g ...
- Vue-Router路由 Vue-CLI脚手架和模块化开发 之 使用路由对象获取参数
使用路由对象$route获取参数: 1.params: 参数获取:使用$route.params获取参数: 参数传递: URL传参:例 <route-linke to : "/food ...
- FIT2096 Assignment 2 2019
FIT2096 Assignment 2 2019_v1.2.docx 9/04/2019 11:34 AMPage 1 | 4FIT2096 Assignment 2 2019Transformat ...
- Parhaps you are running on a JRE rather than a JDK?
maven项目启动时报错 解决方案: 第一步:在启动项目上右击 第二步:修改JRE为JDK,双击划线部分 第三步:如果没有配置JDK,进行以下操作 第四步:从本地添加JDK 第五步:应用JDK 选择好 ...
- 浅谈Tarjan算法
从这里开始 预备知识 两个数组 Tarjan 算法的应用 求割点和割边 求点-双连通分量 求边-双连通分量 求强连通分量 预备知识 设无向图$G_{0} = (V_{0}, E_{0})$,其中$V_ ...