【转】RabbitMQ六种队列模式-4.路由模式

前言

RabbitMQ六种队列模式-简单队列
RabbitMQ六种队列模式-工作队列
RabbitMQ六种队列模式-发布订阅
RabbitMQ六种队列模式-路由模式 [本文]
RabbitMQ六种队列模式-主题模式

本文带大家了解 RabbitMQ 队列模式中的路由模式。

其实只要看过上篇发布模式后,相信路由模式上手就非常 easy 了,唯一差距就是两个参数,exchange类型和 routingKey 。

文章目录

1. 什么是路由模式2. 代码部分2.1 日志生产者2.2 info消费者2.3 error消费者2.4 运行截图3. 路由模式总结

1. 什么是路由模式

官网链接:https://msd.misuland.com/pd/2884250137616455578

路由模式跟发布订阅模式类似,然后在订阅模式的基础上加上了类型,订阅模式是分发到所有绑定到交换机的队列,路由模式只分发到绑定在交换机上面指定路由键的队列,我们可以看一下下面这张图:

P 表示为生产者、 X 表示交换机、C1C2 表示为消费者,红色表示队列。

上图是一个结合日志消费级别的配图,在路由模式它会把消息路由到那些 binding key 与 routing key 完全匹配的 Queue 中,此模式也就是 Exchange 模式中的 direct 模式。

以上图的配置为例,我们以 routingKey="error" 发送消息到 Exchange,则消息会路由到Queue1(amqp.gen-S9b…,这是由RabbitMQ自动生成的Queue名称)和Queue2(amqp.gen-Agl…)。如果我们以 routingKey="info" 或 routingKey="warning" 来发送消息,则消息只会路由到 Queue2。如果我们以其他 routingKey 发送消息,则消息不会路由到这两个 Queue 中。

相对于发布订阅模式,我们可以看到不再是广播似的接收全部消息,而是有选择性的消费。

我们就以接收不同日志级别的队列为例吧。

2. 代码部分

2.1 日志生产者

public class ProdecerRouting {private static final String EXCHANGE_NAME = "my_fanout_exchange";public static void main(String[] args) throws IOException, TimeoutException {/** 1.创建新的连接 */Connection connection = MQConnectionUtils.newConnection();/** 2.创建通道 */Channel channel = connection.createChannel();/** 3.绑定的交换机 参数1交互机名称 参数2 exchange类型 */channel.exchangeDeclare(EXCHANGE_NAME, "direct");/** 4.发送消息 */String message = "",sendType="";for (int i = 0; i < 10; i++){if(i%2==0){sendType = "info";message = "我是 info 级别的消息类型:" + i;}else{sendType = "error";message = "我是 error 级别的消息类型:" + i;}System.out.println("[send]:" + message + "  " +sendType);channel.basicPublish(EXCHANGE_NAME, sendType, null, message.getBytes("utf-8"));try {Thread.sleep(5 * i);} catch (InterruptedException e) {e.printStackTrace();}}/** 5.关闭通道、连接 */channel.close();connection.close();/** 注意:如果消费没有绑定交换机和队列,则消息会丢失 */}}

注意:exchangeDeclare() 方法 exchange 类型为 direct

2.2 info消费者

public class ConsumerInfo {private static final String QUEUE_NAME = "consumer_info";private static final String EXCHANGE_NAME = "my_fanout_exchange";public static void main(String[] args) throws IOException, TimeoutException {System.out.println("info消费者启动");/* 1.创建新的连接 */Connection connection = MQConnectionUtils.newConnection();/* 2.创建通道 */Channel channel = connection.createChannel();/* 3.消费者关联队列 */channel.queueDeclare(QUEUE_NAME, false, false, false, null);/* 4.消费者绑定交换机 参数1 队列 参数2交换机 参数3 routingKey */channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "info");DefaultConsumer consumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)throws IOException {String msg = new String(body, "UTF-8");System.out.println("消费者获取生产者消息:" + msg);}};/* 5.消费者监听队列消息 */channel.basicConsume(QUEUE_NAME, true, consumer);}}

2.3 error消费者

public class ConsumerError {private static final String QUEUE_NAME = "consumer_error";private static final String EXCHANGE_NAME = "my_fanout_exchange";public static void main(String[] args) throws IOException, TimeoutException {System.out.println("error消费者启动");/* 1.创建新的连接 */Connection connection = MQConnectionUtils.newConnection();/* 2.创建通道 */Channel channel = connection.createChannel();/* 3.消费者关联队列 */channel.queueDeclare(QUEUE_NAME, false, false, false, null);/* 4.消费者绑定交换机 参数1 队列 参数2交换机 参数3 routingKey */channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "error");DefaultConsumer consumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)throws IOException {String msg = new String(body, "UTF-8");System.out.println("消费者获取生产者消息:" + msg);}};/* 5.消费者监听队列消息 */channel.basicConsume(QUEUE_NAME, true, consumer);}}

2.4 运行截图

先运行两个消费者,再运行生产者。如果没有提前将队列绑定到交换机,那么直接运行生产者的话,消息是不会发到任何队列里的。

生产者

info消费者

error消费者

3. 路由模式总结

1、两个队列消费者设置的路由不一样,接收到的消息就不一样。路由模式下,决定消息向队列推送的主要取决于路由,而不是交换机了。  

2、该模式必须设置交换机,且声明路由模式 channel.exchangeDeclare(EXCHANGE_NAME, "direct");

生产者发送消息到交换机,同时定义了一个路由 routingKey,多个消费者声明多个队列,与交换机进行绑定,同时定义路由 routingKey,只有路由 routingKey相同的消费者才能消费数据

案例代码:https://www.lanzous.com/i5ydu6d

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百度二年级手工机器人_让父母少弯腰的家务神器——追觅扫拖机器人慧目F9评测...

大家好&#xff0c;我是CC。父母都已过了花甲之年&#xff0c;退休在家本应是享清福的时候&#xff0c;为了照顾双上班族的我&#xff0c;平时承担了接儿子放学和给我蹭晚餐的任务&#xff0c;操劳不少。眼看着他们一点点老去&#xff0c;总想也为他们做点什么&#xff0c;所以…

【转】RabbitMQ六种队列模式-5.主题模式

前言 RabbitMQ六种队列模式-简单队列RabbitMQ六种队列模式-工作队列RabbitMQ六种队列模式-发布订阅RabbitMQ六种队列模式-路由模式RabbitMQ六种队列模式-主题模式 [本文] 从前面的几篇我们依次经历了 exchange 模式从 fanout > direct 的转变过程&#xff0c;在 fanout 时&a…

javase哪部分最难_高中物理哪部分最难?这里有答案和方法!一定要收藏

高中物理最难的部分是什么?对于大多数同学来说&#xff0c;电粒子在电磁场中的运动、动力学分析以及电学实验比较难搞定&#xff0c;看看下面的方法&#xff0c;希望对你有所帮助。从应试而言&#xff0c;应是带电粒子在电磁场中的运动(力&#xff0c;运动轨迹&#xff0c;几何…

【转】分布式websocket服务器

最近在开发一个游戏的客服系统&#xff0c;同一时间咨询问题的玩家多&#xff0c;为了保证服务器高可用&#xff0c;需要利用分布式&#xff0c;另外服务器宕机还需要玩家无感知重连&#xff0c;最关键的一点是如何实现服务器的高扩展性&#xff0c;即性能不足时&#xff0c;如…

【Rational Rose使用笔记】协作图

例题 用例题亲自画一下是最好的。 例题出处&#xff1a;掌握在Rational Rose中绘制协作图&#xff08;交互图&#xff09;的操作方法 其他参考文章&#xff1a; UML–协作图详解UML中创建对象的方法&#xff1a;Rational Rose建立对象图 笔记 以下是总结的一些笔记&#x…

【Rational Rose使用笔记】用例图

一 先找例题&#xff1a; 掌握运用Rose工具绘制用例图的基本操作 再学习&#xff1a; UML建模——用例图&#xff08;Use Case Diagram&#xff09; 二 下面是笔记&#xff1a; 了解几种关系&#xff1a;依赖、关联、泛化、包含、扩展。 如何区别依赖、关联&#xff1f; 依…

sqlserver获取当前时间_c#获取并显示当前日期时间

主要使用ToLongDateString、ToShortDateString、ToLongTimeString、ToShortTimeString、DayOfWeek等获取日期、时间、星期等数据。MM 两位数月份mm 两位数分钟HH 两位小时&#xff0c;24小时制hh 两位小时&#xff0c;12小时制string br ""; string a1 D…

【考研计算机】AOE关键路径

介绍 数据结构AOE网 计算题专题&#xff1a;关键路径法(CPM) 需要注意的点&#xff1a; 最重要的点&#xff0c;以下图为例&#xff1a; 一个活动有多个入口&#xff0c;这是表示此活动必须在前置的多个入口都完成时&#xff0c;才能开始。 即&#xff0c;开始条件 入口1 &…

【转】.NET程序内存分析工具CLRProfiler的使用

大家都知道.net有一套自己的内存&#xff08;垃圾&#xff09;回收机制&#xff0c;除非有一些数据&#xff08;方法&#xff09;长期占有内存不随着垃圾回收功能而释放内存&#xff0c;这样就造成了我们经常说的内存泄露、内存持续增长得不到释放等问题导致APS.net网站或者C/S…

sql over函数_SQL 高级函数

今天是高端局&#xff0c;都是超级高大上的内容&#xff0c;惯例上目录今天觉得红黑配色好好看呀今天没有什么具体的栗子合集&#xff0c;大家的应用场景都很不一样&#xff0c;so&#xff0c;到具体知识点&#xff0c;我们再具体举栗子。窗口函数概念&#xff1a; 窗口函数&am…

【转】SVN各种颜色状态

黄色感叹号(有冲突): 这是有冲突了&#xff0c;冲突就是说你对某个文件进行了修改&#xff0c;别人也对这个文件进行了修改&#xff0c;别人抢在你提交之前先提交了&#xff0c;这时你再提交就会被提示发生冲突&#xff0c;而不允许你提交&#xff0c;防止你的提交覆盖了别人的…

实现二分归并排序算法_如何实现归并排序?

归并排序归并排序是分而治之的排序算法。划分步骤很简单&#xff1a;将当前数组分成两半(如果N是偶数&#xff0c;则将其完全平等&#xff0c;或者如果N是奇数&#xff0c;则一边稍大于一个元素)&#xff0c;然后递归地对这两半进行排序。递归写法归并排序递归写法的思想是&…

【手算】逆序数树形计算方法

计算过程&#xff1a; 给定一列数&#xff0c;从左向右&#xff0c;依次将每个数拿出来&#xff0c;作为一棵树的树根。从剩下的数中&#xff0c;找比此数小的数&#xff0c;作为子节点加入到树中。重复1、2&#xff0c;直到到达最后一个数停止。 数出二级节点&#xff0c;即…

【转】SVN冲突出现场景

如今是一个团结协作的时代&#xff0c;开发一个系统&#xff0c;往往会多人协作共同完成。版本管理是必不可少的&#xff0c;常用的软件有Git&#xff0c;SVN等。今天说一下&#xff0c;SVN管理版本时&#xff0c;如果出现冲突后&#xff0c;如何快速解决冲突。 首先说明一个问…

Qt Creator和Visual Studio双环境开发技能攻略

前言 刚接触Qt开发时&#xff0c;大多数同学的第一行Qt代码是在Qt Creator中写下的。 众所周知&#xff0c;Qt Creator是Qt官方提供的Qt集成开发环境1&#xff0c;提供了对Qt应用开发的全过程支持。也就是说&#xff0c;使用Qt Creator做Qt开发是完全够用的。不管是在Windows…

大疆无人机高程不准_大疆消费级无人机快速倾斜摄影测量实践

摘要&#xff1a;分别用 RTK两种测量模式测定像控点&#xff0c;用大疆消费级无人机 Phantom&#xff14;PRO 开展倾斜摄影测量&#xff0c;最后进行成果检验。结果表明&#xff1a;RTK 电台模式(不做坐标校正&#xff0c;精度低)、RTK&#xff0d;CORS 网络模式测定像控点都能…

【转】CLR Profiler 性能分析工具 (转)

最近关注程序性能的优化方面&#xff0c;本想写篇CLRProfiler的简要文档&#xff0c;看到pengpeng已写好&#xff0c;那就转载好了&#xff0c;偷偷懒。 .Net的尽管拥有非常强大调试器&#xff0c;但也有很多局限性&#xff0c;只限于CLR之上&#xff0c;无法得到CLR的具体细节…

魔百盒哪款型号配置高_松下负离子吹风机怎么样哪款好?推荐型号?2020年9月松下负离子电吹风选购攻略...

先说结论&#xff0c;方便时间不多的朋友&#xff0c;松下&#xff08;panasonic&#xff09;负离子吹风机怎么样哪款好&#xff1f;推荐型号&#xff1f;1、EH-ENE2-A405——松下&#xff08;panasonic&#xff09;负离子电吹风机推荐EH-ENE2-A405。带负离子功能&#xff0c;1…

【转】WebAPI ASP.Net 发布部署中常见的两个错误未能找到 CodeDom未能加载System.Web.WebPages.Razor

未能加载文件或程序集“System.Web.WebPages.Razor, Version3.0.0.0, Culturene 未能找到 CodeDom 提供程序类型“Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft... 在包管理器中异常安装包MVC5 及 CodeDom&#xff0c;重新编译部署即可…

QSplitter设置宽高比例的正确方法

问题 实际开发中&#xff0c;需要经常调整QSplitter中子窗口的宽度/高度比例。对水平QSplitter来说&#xff0c;是宽度比例&#xff1b;对垂直QSplitter来说&#xff0c;是高度比例。下面以水平QSplitter为例说明。 我们首先应该会想起看看QSplitter是不是有设置比例的函数。…