RabbitMQ的Routing 路由模式(Direct)
RabbitMQ的Routing 路由模式
模式说明:
- 队列与交换机的绑定,不能是任意绑定了,而是要指定一个 RoutingKey(路由key)
- 消息的发送方在向 Exchange 发送消息时,也必须指定消息的 RoutingKey
- Exchange 不再把消息交给每一个绑定的队列,而是根据消息的 Routing Key 进行判断,只有队列的Routingkey 与消息的 Routing key 完全一致,才会接收到消息
Routing 路由模式的图片
图解:
- P:生产者,向 Exchange 发送消息,发送消息时,会指定一个routing key
- X:Exchange(交换机),接收生产者的消息,然后把消息递交给与 routing key 完全匹配的队列
- C1:消费者,其所在队列指定了需要 routing key 为 error 的消息
- C2:消费者,其所在队列指定了需要 routing key 为 info、error、warning 的消息
其实这个Routing 路由模式是Exchange常见类型之一的
Direct
代码编写生产者(Direct模式)步骤
- 创建工厂
- 设置参数
- 创建连接
- 创建管道channel
- 创建交换机
- 创建队列(
test_direct_queue1
和test_direct_queue2
) - 绑定队列和交换机
- 发送消息
- 关闭连接
package com.yang;import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;import java.io.IOException;
import java.util.concurrent.TimeoutException;public class Producer_Routing {public static void main(String[] args) throws IOException, TimeoutException {//1 .创建工厂ConnectionFactory factory = new ConnectionFactory();//2. 设置参数factory.setHost("192.168.20.146");factory.setPort(5672);factory.setUsername("test");factory.setPassword("test");factory.setVirtualHost("/test");//3. 创建连接Connection connection = factory.newConnection();//4. 创建管道channelChannel channel = connection.createChannel();//5. 创建交换机String exchangeName = "test_direct";channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT,true,false,null);//6. 创建队列String queueName1 = "test_direct_queue1";String queueName2 = "test_direct_queue2";channel.queueDeclare(queueName1,true,false,false,null);channel.queueDeclare(queueName2,true,false,false,null);//7. 绑定交换机和队列channel.queueBind(queueName1,exchangeName,"error");channel.queueBind(queueName2,exchangeName,"info");channel.queueBind(queueName2,exchangeName,"error");channel.queueBind(queueName2,exchangeName,"warning");//8. 发送消息String body = "日志信息:张三调用了delete方法...出错误了。。。日志级别:error...";channel.basicPublish(exchangeName,"error",null,body.getBytes());//9. 释放资源}
}
- 尝试运行
- 说明因为我们两个队列的
routingKey
都有error
(步骤7),而我们发送的消息的routingKey
同样写着error
(步骤8) - 假如我们发送的步骤8的是
info
那么queueName2
会增加一条队列变成2,而queueName1
不变(原有都是1基础上的改变)
//8. 发送消息String body = "日志信息:张三调用了普通方法..日志级别:info...";channel.basicPublish(exchangeName,"info",null,body.getBytes());
- 结果
- 代码编写消费者(Direct模式)步骤
- 创建工厂
- 设置参数
- 创建连接
- 创建管道channel
- 创建交换机
- 创建队列(
test_direct_queue1
和test_direct_queue2
) (生产者创建过) - 绑定队列和交换机 (生产者已经绑定过)
- 接收消息
- 关闭连接 (因为要一直接收)
package com.yang;import com.rabbitmq.client.*;import java.io.IOException;
import java.util.concurrent.TimeoutException;public class Consumer_Routing1 {public static void main(String[] args) throws IOException, TimeoutException {//1. 创建工厂ConnectionFactory factory = new ConnectionFactory();//2. 设置参数factory.setHost("192.168.20.146");factory.setPort(5672);factory.setUsername("test");factory.setPassword("test");factory.setVirtualHost("/test");//3. 创建连接Connection connection = factory.newConnection();//4. 创建channel管道Channel channel = connection.createChannel();//5. 创建交换机(不需要)//6. 创建队列(不需要)//7. 绑定队列和交换机(不需要)//8. 接收消息Consumer consumer = new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println(new String(body));}};String queueName1 = "test_direct_queue1";String queueName2 = "test_direct_queue2";channel.basicConsume(queueName1,true,consumer);//9.关闭连接(不需要)}
}
- 第二个队列只需要队列名改一下就行了!
- 两个的执行结果
- Consumer_Routing1(队列:
test_direct_queue1
)
- Consumer_Routing2(队列:
test_direct_queue2
)
- Consumer_Routing1(队列:
- 小结
- Routing 模式要求队列在绑定交换机时要指定 routing key,消息会转发到符合 routing key 的队列。
以上就是Routing 路由模式的全部内容
RabbitMQ的Routing 路由模式(Direct)相关推荐
- RabbitMQ(六) Routing路由模式
概述 所谓RabbitMq中路由模式(Routing)为我们在将发送消息队列以及接收消息队列(queue)绑定到交换机(exchange)时指定了一个RoutingKey.然后我们在通过连接信道向交换 ...
- RabbitMQ学习系列(五):routing路由模式和Topic主题模式
(一)routing路由模式 在前面一篇博客中讲到了exchange的类型,其中direct类型的exchange就是用于routing路由模式.direct类型的交换机是指:交换机和队列绑定时会设置 ...
- 路由模式 - direct
2019独角兽企业重金招聘Python工程师标准>>> package com.shi.rout;import java.io.IOException; import java.ut ...
- Java笔记-使用RabbitMQ的Java接口实现Routing(路由模式)
目录 基本概念 代码与实例 基本概念 过程图如下: 主要是把交换机设置为直连的方式direct直连的方式然后把 数据 发送给交换机. 交换机再通过路由的Key值转发到队列上. 每一个客户端,都有一个队 ...
- RabbitMq | springboot (路由模式RoutingKey)整合Direct交换器
生产者发送消息到交换机并指定一个路由key,消费者队列绑定到交换机时要制定路由key(key匹配就能接受消息,key不匹配就不能接受消息) 引入依赖: <dependency><gr ...
- RabbitMQ学习(四) 订阅模式-Direct(直连)
直连模式说明 在fanout模式中,一条消息,会被所有订阅的队列都消费,但是在某些场景下,我们希望不同的消息被不同的队列消费,这时就要用到Direct类型的Exchange. 使用说明 1.相较于fa ...
- RabbitMQ路由模式(direct)
1.什么是路由模式(direct) 路由模式是在使用交换机的同时,生产者指定路由发送数据,消费者绑定路由接受数据.与发布/订阅模式不同的是,发布/订阅模式只要是绑定了交换机的队列都会收到生产者向交换机 ...
- c#服务器后端_C#使用RabbitMq队列(Sample,Work,Fanout,Direct等模式的简单使用)
1:RabbitMQ是个啥?(专业术语参考自网络) RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件). RabbitMQ服务器是用Erlang语言编写的, ...
- rabbitmq几种工作模式_RabbitMQ的六种工作模式总结
精品推荐 国内稀缺优秀Java全栈课程-Vue+SpringBoot通讯录系统全新发布! 作者:侧身左睡 https://www.cnblogs.com/xyfer1018/p/11581511.ht ...
最新文章
- 田志刚:所有大公司都是小公司(二)
- jmeter响应数据Unicode编码转换为汉字
- P1091 合唱队形(LIS)
- C语言菱形是怎么实现的?
- docker run常用参数说明
- bzoj1045 糖果传递
- uniapp框架之如何修改接口传参的参数
- php 类似微信下拉菜单,微信小程序模拟下拉菜单开发实例
- java wps linux 安装_ubuntu安装Java开发环境
- IM开发基础知识补课:正确理解前置HTTP SSO单点登陆接口的原理
- 计算机系统的优化具体操作,win7系统优化提升低配置电脑运行速度的详细技巧...
- 为什么要学习 Spring Boot?
- K3 Cloud 表体显示序号
- Struts1和Struts2对比
- 大话西游2服务器修改,大话西游2:9.17维护解读:五倍次数修改全服上线,灵兽村要变样啦...
- Web of science以及中国知网学术论文爬取教程(附代码)
- 设计模式 —— 装饰模式
- QT 实现类似于qq的登录注册界面
- Unity3d 音效 音乐 大小控制
- FileProvider共享文件
热门文章
- python数据结构与算法 20 递归和递归三定律
- TypeScript超详细入门教程(上)
- 3月9日 笔记:RANSAC随机样本一致性,灭点、对极几何计算、H矩阵、PNP估计相机位置,3D匹配、投影变换、N点定位求解姿态
- CYY文本批量助手2.0绿色版正式发布
- 深度学习系列25:注意力机制
- word批量删除单选、多选题的答案
- adobe cs4系列套装及注册机下载
- 大庆铁人精神与时俱进 石油石化行业如何利用ICT基础设施驱动价值创造?
- python爬虫豆瓣top250_Python 爬取豆瓣TOP250实战
- Android-第十三节04Room框架详解