RabbitMQ 入门(六)SpringAMQP五种消息类型(Direct Exchange)

devtools/2024/10/19 21:26:38/

一、发布订阅-DirectExchange(路由模式)

        在Fanout模式中,一条消息,会被所有订阅的队列都消费。但是,在某些场景下,我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。

        Direct Exchange 会将接收到的消息根据规则路由到指定queue,因此称为路由模式(routes)。

       - 每一个Queue都与Exchange设置一个BindingKey
       - 发布者发送消息时,指定消息的RoutingKey
       - Exchange将消息路由到BindingKey与消息RoutingKey一致的队列;
       - 一个Queue可以绑定多个BindingKey,也就是说Direct Exchange可以模拟Fanout但是比Fanout灵活。


 在Direct模型下:

- 队列与交换机的绑定,不能是任意绑定了,而是要指定一个`RoutingKey`(路由key)
- 消息的发送方在 向 Exchange发送消息时,也必须指定消息的 `RoutingKey`。
- Exchange不再把消息交给每一个绑定的队列,而是根据消息的`Routing Key`进行判断,只有队列的`Routingkey`与消息的 `Routing key`完全一致,才会接收到消息
 

二、DirectExchange演示案例

实现思路如下:

1. 利用@RabbitListener声明Exchange、Queue、RoutingKey(不使用bean声明,基于@RabbitListener注解声明)

2. 在consumer服务中,编写两个消费者方法,分别监听direct.queue1和direct.queue2

3. 在publisher中编写测试方法,向it. direct发送消息

具体步骤:

步骤一:

1.在consumer服务中,编写两个消费者方法,分别监听direct.queue1和direct.queue2,

2.并利用@RabbitListener声明Exchange、Queue、RoutingKey

@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "direct.queue1"),exchange = @Exchange(name = "it.direct", type = ExchangeTypes.DIRECT),key = {"red", "blue"}
))
public void listenDirectQueue1(String msg){System.out.println("消费者接收到direct.queue1的消息:【" + msg + "】");
}@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "direct.queue2"),exchange = @Exchange(name = "it.direct", type = ExchangeTypes.DIRECT),key = {"red", "yellow"}
))
public void listenDirectQueue2(String msg){System.out.println("消费者接收到direct.queue2的消息:【" + msg + "】");
}

步骤二:在publisher服务的SpringAmqpTest类中添加测试方法,向it. direct发送消息

@Test
public void testSendDirectExchange() {// 交换机名称String exchangeName = "it.direct";// 消息String message = "hello,red!";// 发送消息rabbitTemplate.convertAndSend(exchangeName, "red", message);
}

        

 Direct模式总结: 


Direct交换机与Fanout交换机的差异:

- Fanout交换机将消息路由给每一个与之绑定的队列
- Direct交换机根据RoutingKey判断路由给哪个队列
- 如果多个队列具有相同的RoutingKey,则与Fanout功能类似

基于@RabbitListener注解声明队列和交换机常见注解:

 @Queue
 @Exchange


http://www.ppmy.cn/devtools/127105.html

相关文章

git基础操作

“git” 文章目录 文章有误敬请斧正 不胜感恩! Git分布式版本控制工具1.目标:2.概述:3.git3.1git基本操作:常用命令配置git环境:git config --global创建本地空仓库:新建文件添加到本地仓库:git add、git commit -m添加到暂存区提…

区块链技术的应用场景和优势

区块链技术的应用场景和优势非常广泛。以下是一些常见的应用场景和优势: 1. 金融服务:区块链技术可以提供更安全、更高效、更透明的金融交易。它可以用于支付和结算、股票交易、贷款和借款、智能合约等金融服务领域。 2. 物联网(IoT&#x…

联邦学习实验复现—MNISIT IID实验 pytorch

联邦学习论文复现🚀 在精度的联邦学习的论文之后打算进一步开展写一个联邦学习的基础代码,用于开展之后的相关研究,首先就是复现一下论文中最基础也是最经典的MNIST IID(独立同分布划分) 数据集。然后由于这个联邦学习的论文是谷歌发的&#…

OpenCV高级图形用户界面(19)设置窗口属性的函数setWindowProperty()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 动态地改变窗口参数 该函数 setWindowProperty 允许改变窗口的属性。 cv::setWindowProperty 是 OpenCV 中用于设置窗口属性的函数。它可以用来…

QT QML 练习3

这段代码使用 QtQuick 实现了一个包含图片和文本的简单 GUI 界面。以下是代码的详细介绍及其特点: 代码结构及实现细节 导入 QtQuick 模块 import QtQuick引入 QtQuick 模块,用于创建动画、布局以及 GUI 组件。 根元素 (Rectangle) Rectangle {id: roo…

原型链+instanceof+Vue底层原理

一些重要的前端知识总结(基于笔面试题的扩展),包含原型链、instanceof、深度剖析Vue底层原理 目录 一、原型链 二、instanceof 1. instanceof 2. 用法 三、defineProperty和Proxy 1. vue架构-MVVM 2. render函数 1)render…

49 | 桥接模式:如何实现支持不同类型和渠道的消息推送系统?

上一篇文章我们学习了第一种结构型模式:代理模式。它在不改变原始类(或者叫被代理类)代码的情况下,通过引入代理类来给原始类附加功能。代理模式在平时的开发经常被用到,常用在业务系统中开发一些非功能性需求&#xf…

vue $nextTick 实现原理

nextTick的实现 一:nextTick介绍二:手写nextTick三:具体代码四:实现细节 一:nextTick介绍 nextTick 是 Vue.js 框架中的一个方法,它允许延迟执行一个函数,直到 DOM 更新完成。当你修改了数据并…