RabbitMQ的Routing 路由模式

  • 模式说明:

    1. 队列与交换机的绑定,不能是任意绑定了,而是要指定一个 RoutingKey(路由key)
    2. 消息的发送方在向 Exchange 发送消息时,也必须指定消息的 RoutingKey
    3. 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模式)步骤

    1. 创建工厂
    2. 设置参数
    3. 创建连接
    4. 创建管道channel
    5. 创建交换机
    6. 创建队列(test_direct_queue1test_direct_queue2)
    7. 绑定队列和交换机
    8. 发送消息
    9. 关闭连接
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模式)步骤

    1. 创建工厂
    2. 设置参数
    3. 创建连接
    4. 创建管道channel
    5. 创建交换机
    6. 创建队列(test_direct_queue1test_direct_queue2) (生产者创建过)
    7. 绑定队列和交换机 (生产者已经绑定过)
    8. 接收消息
    9. 关闭连接 (因为要一直接收)
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.关闭连接(不需要)}
}
  • 第二个队列只需要队列名改一下就行了!
  • 两个的执行结果
    1. Consumer_Routing1(队列:test_direct_queue1)
    2. Consumer_Routing2(队列:test_direct_queue2)

  • 小结

    • Routing 模式要求队列在绑定交换机时要指定 routing key,消息会转发到符合 routing key 的队列。

以上就是Routing 路由模式的全部内容

RabbitMQ的Routing 路由模式(Direct)相关推荐

  1. RabbitMQ(六) Routing路由模式

    概述 所谓RabbitMq中路由模式(Routing)为我们在将发送消息队列以及接收消息队列(queue)绑定到交换机(exchange)时指定了一个RoutingKey.然后我们在通过连接信道向交换 ...

  2. RabbitMQ学习系列(五):routing路由模式和Topic主题模式

    (一)routing路由模式 在前面一篇博客中讲到了exchange的类型,其中direct类型的exchange就是用于routing路由模式.direct类型的交换机是指:交换机和队列绑定时会设置 ...

  3. 路由模式 - direct

    2019独角兽企业重金招聘Python工程师标准>>> package com.shi.rout;import java.io.IOException; import java.ut ...

  4. Java笔记-使用RabbitMQ的Java接口实现Routing(路由模式)

    目录 基本概念 代码与实例 基本概念 过程图如下: 主要是把交换机设置为直连的方式direct直连的方式然后把 数据 发送给交换机. 交换机再通过路由的Key值转发到队列上. 每一个客户端,都有一个队 ...

  5. RabbitMq | springboot (路由模式RoutingKey)整合Direct交换器

    生产者发送消息到交换机并指定一个路由key,消费者队列绑定到交换机时要制定路由key(key匹配就能接受消息,key不匹配就不能接受消息) 引入依赖: <dependency><gr ...

  6. RabbitMQ学习(四) 订阅模式-Direct(直连)

    直连模式说明 在fanout模式中,一条消息,会被所有订阅的队列都消费,但是在某些场景下,我们希望不同的消息被不同的队列消费,这时就要用到Direct类型的Exchange. 使用说明 1.相较于fa ...

  7. RabbitMQ路由模式(direct)

    1.什么是路由模式(direct) 路由模式是在使用交换机的同时,生产者指定路由发送数据,消费者绑定路由接受数据.与发布/订阅模式不同的是,发布/订阅模式只要是绑定了交换机的队列都会收到生产者向交换机 ...

  8. c#服务器后端_C#使用RabbitMq队列(Sample,Work,Fanout,Direct等模式的简单使用)

    1:RabbitMQ是个啥?(专业术语参考自网络) RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件). RabbitMQ服务器是用Erlang语言编写的, ...

  9. rabbitmq几种工作模式_RabbitMQ的六种工作模式总结

    精品推荐 国内稀缺优秀Java全栈课程-Vue+SpringBoot通讯录系统全新发布! 作者:侧身左睡 https://www.cnblogs.com/xyfer1018/p/11581511.ht ...

最新文章

  1. 田志刚:所有大公司都是小公司(二)
  2. jmeter响应数据Unicode编码转换为汉字
  3. P1091 合唱队形(LIS)
  4. C语言菱形是怎么实现的?
  5. docker run常用参数说明
  6. bzoj1045 糖果传递
  7. uniapp框架之如何修改接口传参的参数
  8. php 类似微信下拉菜单,微信小程序模拟下拉菜单开发实例
  9. java wps linux 安装_ubuntu安装Java开发环境
  10. IM开发基础知识补课:正确理解前置HTTP SSO单点登陆接口的原理
  11. 计算机系统的优化具体操作,win7系统优化提升低配置电脑运行速度的详细技巧...
  12. 为什么要学习 Spring Boot?
  13. K3 Cloud 表体显示序号
  14. Struts1和Struts2对比
  15. 大话西游2服务器修改,大话西游2:9.17维护解读:五倍次数修改全服上线,灵兽村要变样啦...
  16. Web of science以及中国知网学术论文爬取教程(附代码)
  17. 设计模式 —— 装饰模式
  18. QT 实现类似于qq的登录注册界面
  19. Unity3d 音效 音乐 大小控制
  20. FileProvider共享文件

热门文章

  1. python数据结构与算法 20 递归和递归三定律
  2. TypeScript超详细入门教程(上)
  3. 3月9日 笔记:RANSAC随机样本一致性,灭点、对极几何计算、H矩阵、PNP估计相机位置,3D匹配、投影变换、N点定位求解姿态
  4. CYY文本批量助手2.0绿色版正式发布
  5. 深度学习系列25:注意力机制
  6. word批量删除单选、多选题的答案
  7. adobe cs4系列套装及注册机下载
  8. 大庆铁人精神与时俱进 石油石化行业如何利用ICT基础设施驱动价值创造?
  9. python爬虫豆瓣top250_Python 爬取豆瓣TOP250实战
  10. Android-第十三节04Room框架详解