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类型

有时候,我们需要发布/订阅消息有多个筛选类型,比如发布一个动物消息:移动速度,颜色,类别.当需要订阅所有同一个颜色的动物时,比如全部移动速度,黑色,所有类别.此时涉及到模糊匹配,使用fanoutdirect类型不符合要求,此时要用到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发布和订阅消息的更多相关文章

  1. Redis的高级应用-事务处理、持久化、发布与订阅消息、虚拟内存使用

    三.事务处理 Redis的事务处理比较简单.只能保证client发起的事务中的命令可以连续的执行,而且不会插入其他的client命令,当一个client在连接 中发出multi命令时,这个连接就进入一 ...

  2. EasyNetQ使用(六)【多态发布和订阅,消息版本控制】

    你能够订阅一个接口,然后发布基于这个接口的实现. 让我们看下一个示例.我有一个接口IAnimal和两个实现Cat和Dog: public interface IAnimal { string Name ...

  3. Redis 发布与订阅 消息

    基于Redis消息队列-实现短信服务化 1.Redis实现消息队列原理 常用的消息队列有RabbitMQ,ActiveMQ,个人觉得这种消息队列太大太重,本文介绍下基于Redis的轻量级消息队列服务. ...

  4. JMS发布/订阅消息传送例子

    前言 基于上篇文章"基于Tomcat + JNDI + ActiveMQ实现JMS的点对点消息传送"很容易就可以编写一个发布/订阅消息传送例子,相关环境准备与该篇文章基本类似,主要 ...

  5. Kafka是分布式发布-订阅消息系统

    Kafka是分布式发布-订阅消息系统 https://www.biaodianfu.com/kafka.html Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apa ...

  6. 高吞吐量的分布式发布订阅消息系统Kafka--安装及测试

    一.Kafka概述 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因 ...

  7. 分布式发布订阅消息系统 Kafka 架构设计[转]

    分布式发布订阅消息系统 Kafka 架构设计 转自:http://www.oschina.net/translate/kafka-design 我们为什么要搭建该系统 Kafka是一个消息系统,原本开 ...

  8. 分布式发布订阅消息系统Kafka

    高吞吐量的分布式发布订阅消息系统Kafka--安装及测试   一.Kafka概述 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动作(网页浏览, ...

  9. Kafka logo分布式发布订阅消息系统 Kafka

    分布式发布订阅消息系统 Kafka kafka是一种高吞吐量的分布式发布订阅消息系统,她有如下特性: 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳 ...

随机推荐

  1. WebSphere应用程序更新方式

    在日常的使用中,一个javaee程序部署以后,以后续的使用中会有模块等的更新,但我经常见到有人直接更新服务器上的类包,文件等,(可能是tomcat,jboss这种热部署使用惯了)这样子的方式有几个问题 ...

  2. 日常开发工作常用linux命令

    :wq 保存退出 :q! 强制退出 vi 查看 vim 编辑 rpm -qa|grep jdk 命令查看当前的jdk情况 yum -y remove java java-1.7.0-openjdk* ...

  3. MyBatis笔记(一) 最简单的select

    小白学习MyBatis的第一天,学习资料包括MyBatis3的官方文档,以及孤傲苍狼大佬的博客.这里先致敬大佬. · 首先,什么是MyBatis? 引用官网的一段话,“MyBatis 是一款优秀的持久 ...

  4. PHP代码-数据爬取(a标签和a标签所对应的内容)

    public function export(){ set_time_limit(1000); // header("Content-type: text/html; charset=utf ...

  5. Git_GitHub-使用过程遇到的问题——坑(持续添加)

    push错误——>master git push -u origin master 最后找到解决办法如下: 1.先删除远程 Git 仓库 $ git remote rm origin 2.再添加 ...

  6. mongodb常用查询语句

    1.查询所有记录db.userInfo.find();相当于:select* from userInfo; 2.查询去掉后的当前聚集集合中的某列的重复数据db.userInfo.distinct(&q ...

  7. 容器中的诊断与分析4——live diagnosis——LTTng

    官网地址 LTTng 简介&使用实战 使用LTTng链接内核和用户空间应用程序追踪 简介: LTTng: (Linux Trace Toolkit Next Generation),它是用于跟 ...

  8. chromdriver与geckodriver和浏览器版本问题

    chromdriver74与chrom74对应 geckodriver024与Firefox66对应 亲测有效

  9. 支持向量机(Support Vector Machine):超平面

    超平面 超平面是 $n$ 维空间的 $n-1$ 维子空间,类似二维空间的直线,三维空间的平面. 分类学习最基本的想法就是基于训练集D在样本空间中找到一个划分超平面,将不同类别的样本分开.以二维空间为例 ...

  10. DataTable2JSON 和 DataTable2Class 性能比较

    DataTable 用 5000行和50000行数据做测试,得出转class效率貌似高一点点,不过优化并不大,还是 sql ,网络请求方面做优化比较显著. jobject 2019-03-07 06: ...