RabbitMQ从入门到进阶(Exchange)

简介: RabbitMQ从入门到进阶(Exchange)

五、交换机


5.1 Exchange


路由 ( routing )就是通过互联的 网络 把 信息 从源地址传输到目的地址的活动

RabbitMQ 消息传递模型的核心思想是: 生产者生产的消息从不会直接发送到队列。实际上,通常生产者甚至都不知道这些消息传递传递到了哪些队列中。

相反,生产者只能将消息发送到交换机(exchange),交换机工作的内容非常简单,一方面它接收来自生产者的消息,另一方面将它们推入队列。交换机必须确切知道如何处理收到的消息。是应该把这些消息放到特定队列还是说把他们到许多队列中还是说应该丢弃它们。这就的由交换机的类型来决定。


5.1.2 交换机类型


共有以下类型:

直接(direct), 主题(topic) ,标题(headers) , 扇出(fanout)


5.1.3 无名交换机


前面我们其实都用到了交换机(默认),但它们属于交换机的无名类型,我们通过空字符串(“”)进行标识。


5.2 临时队列


每当我们连接到 Rabbit 时,我们都需要一个全新的空队列,为此我们可以创建一个具有随机名称的队列,或者能让服务器为我们选择一个随机队列名称那就更好了。其次一旦我们断开了消费者的连接,队列将被自动删除。

创建临时队列的方式如下:

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

image.png


5.3 绑定(binding)


binding 其实是 exchange 和 queue 之间的桥梁,它告诉我们 exchange 和那个队列进行了绑定关系


5.3.1 实现绑定


image.png

和我们图中写的内容一致,生产者把消息发送给交换机。交换机根据Routingkey将消息发送给对应的队列,最后队列把消息传递给消费者

image.png


5.4 Fanout


Fanout 这种类型非常简单。正如从名称中猜到的那样,它是将接收到的所有消息广播到它知道的所有队列中。系统中默认有些 exchange 类型

image.png


5.4.1 Fanout 实战


我们写两个logs接受消息,看看交换机处于fanout状态下消息的处理情况

image.png

image.png

ReceiveLogs01 将接收到的消息打印在控制台

package com.caq.rabbitmq.five;import com.caq.rabbitmq.utils.RabbitMqUtils;import com.rabbitmq.client.Channel;import com.rabbitmq.client.DeliverCallback;/** * 负责消息的接受 */public class ReceiveLogs01 {    private static final String EXCHANGE_NAME = "logs";    public static void main(String[] args) throws Exception {        Channel channel = RabbitMqUtils.getChannel();        //声明一个交换机        channel.exchangeDeclare(EXCHANGE_NAME, "fanout");        //声明一个队列,临时队列(连接的时候存在,不连接的时候自动存在,名称随机)        String queue = channel.queueDeclare().getQueue();        /**         * 绑定交换机与队列         */        channel.queueBind(queue, EXCHANGE_NAME, "");        System.out.println("等待接受消息,把接收到的消息打印在屏幕上.....");        //接受消息        DeliverCallback deliverCallback = (consumerTag, message) -> {            System.out.println("ReceiveLogs01控制台打印接受到的消息" + new String(message.getBody()));        };        //接受消息        channel.basicConsume(queue, true, deliverCallback, consumerTag -> {});    }}

ReceiveLogs02 将接收到的消息存储在磁盘

和上面类似

EmitLog 发送消息给两个消费者接收

package com.caq.rabbitmq.five;import com.caq.rabbitmq.utils.RabbitMqUtils;import com.rabbitmq.client.Channel;import java.util.Scanner;/** * 扇出就是发布订阅 */public class EmitLog {    //交换机的名字    private static final String EXCHANGE_NAME = "logs";    //发送消息    public static void main(String[] args) throws Exception {        Channel channel = RabbitMqUtils.getChannel();        //声明一个交换机        channel.exchangeDeclare(EXCHANGE_NAME, "fanout");        Scanner scanner = new Scanner(System.in);        while (scanner.hasNext()) {            String message = scanner.next();            channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes());            System.out.println("生产者发出消息" + message);        }    }}

处理的结果

image.png

image.png

image.png




相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
1月前
|
消息中间件 Java Kafka
RabbitMQ 入门
RabbitMQ 入门
|
3月前
|
消息中间件 存储 Java
分享一下rocketmq入门小知识
分享一下rocketmq入门小知识
51 0
分享一下rocketmq入门小知识
|
4月前
|
消息中间件 新零售 弹性计算
云消息队列 RabbitMQ 版入门训练营,解锁对比开源优势与零基础实战
欢迎加入「云消息队列 RabbitMQ 版入门训练营」。
165 13
|
3月前
|
网络协议 物联网 测试技术
App Inventor 2 MQTT拓展入门(保姆级教程)
本文演示的是App和一个测试客户端进行消息交互的案例,实际应用中,我们的测试客户端可以看着是任意的、支持MQTT协议的硬件,通过订阅及发布消息,联网硬件与我们的App进行双向数据通信,以实现万物互联的智能控制效果。
195 2
|
4月前
|
消息中间件
云消息队列RabbitMQ版入门训练营 打卡领好礼
云消息队列RabbitMQ版入门训练营 打卡领好礼
55 3
|
3月前
|
消息中间件
快来体验 消息队列RabbitMQ版入门训练营 打卡学习领好礼
快来体验 消息队列RabbitMQ版入门训练营 打卡学习领好礼
62 0
EMQ
|
6月前
|
安全 网络性能优化
MQTT 5.0 报文(Packets)入门指南
MQTT 控制报文是 MQTT 数据传输的最小单元。MQTT 客户端和服务端通过交换控制报文来完成它们的工作,比如订阅主题和发布消息。
EMQ
704 8
MQTT 5.0 报文(Packets)入门指南
|
5月前
|
消息中间件 存储 Kafka
01.RabbitMQ入门
01.RabbitMQ入门
56 0
|
5月前
|
消息中间件 存储 前端开发
RabbitMQ在Java中的完美实现:从入门到精通
本文由木头左介绍如何在Java项目中使用RabbitMQ。RabbitMQ是开源的AMQP实现,支持多种客户端,适合分布式系统中的消息传递。首先需安装Erlang和RabbitMQ,接着在Java项目中添加RabbitMQ客户端库依赖。通过创建连接工厂和连接,建立与RabbitMQ的通信,并展示了创建连接和通道的代码示例。
|
6月前
|
消息中间件 Docker 微服务
RabbitMQ入门指南(十一):延迟消息-延迟消息插件
RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了DelayExchange插件、延迟消息插件实现延迟消息等内容。
958 0