温馨提示:
以下需要控制台声明队列跟交换机的操作也可用代码实现,具体实现方式见以下文章:
RabbitMQ----代码声明队列及交换机(注解方式)-CSDN博客
交换机类型
真正生产环境都会经过exchange来发送消息,而不是直接发送到队列,交换机的类型有以下三种:
- Fanout:广播
- Direct:定向
- Topic: 话题
一、Fanout(广播)交换机
Fanout Exchange 会将接收到的消息广播到每一个跟其绑定的queue,所以也叫广播模式
利用SpringAMQP演示FanoutExchange的使用
实现思路如下:- 在RabbitMQ控制台中,声明队列fanout.queue1和fanout.queue2
- 在RabbitMQ控制台中,声明交换机hmall.fanout,将两个队列与其绑定
- 在consumer服务中,编写两个消费者方法,分别监听fanout.queue1和fanout.queue2
- 在publisher中编写测试方法,向hmall.fanout发送消息
1、控制台声明队列
2、控制台声明交换机
2.1、声明交换机
2.2、绑定队列
3、编写模拟消费者
@RabbitListener(queues = "fanout.queue1") //监听的队列:fanout.queue1 public void listenFanoutQueue1(String msg) throws InterruptedException { System.out.println("消费者1 收到消息:【"+msg+"】"); } @RabbitListener(queues = "fanout.queue2") //监听的队列:fanout.queue2 public void listenFanoutQueue2(String msg) throws InterruptedException { System.out.println("消费者2 收到消息:【"+msg+"】"); }
4、编写模拟发送者
@Test void testSendFanout(){ String exchangeName = "hmall.fanout"; String msg = "hello, fanout everyone"; rabbitTemplate.convertAndSend(exchangeName,null,msg); }
注意:此处的bingingKey为null,表示以广播的形式把消息发送到每个与之关联的队列上
5、结果显示
二、Direct(定向)交换机
Direct Exchange 会将接收到的消息根据规则路由到指定的Queue,因此称为定向路由
- 每一个Queue都与Exchange设置一个BindingKey
- 发布者发送消息时,指定消息的RoutingKey
- Exchange将消息路由到BindingKey与消息RoutingKey一致的队列
利用SpringAMQP演示DirectExchange的使用
需求如下:- 在RabbitMO控制台中,声明队列direct.queue1和direct.queue2
- 在RabbitMQ控制台中,声明交换机hmall.direct,将两个队列与其绑定
- 在consumer服务中,编写两个消费者方法,分别监听direct.queue1和direct.queue2
- 在publisher中编写测试方法,利用不同的RoutingKey向hmall.direct发送消息
1、控制台声明队列
2、控制台声明交换机
2.1、声明交换机
2.2、绑定队列并定义key
3、编写模拟消息消费者
@RabbitListener(queues = "direct.queue1") //监听的队列:direct.queue1 public void listenDirectQueue1(String msg) throws InterruptedException { System.out.println("消费者1 收到消息:【"+msg+"】"); } @RabbitListener(queues = "direct.queue2") //监听的队列:direct.queue2 public void listenDirectQueue2(String msg) throws InterruptedException { System.out.println("消费者2 收到消息:【"+msg+"】"); }
4、编写模拟消息发送者
@Test void testSendDirect(){ String exchangeName = "hmall.direct"; String msg = "hello, direct 绿色警报"; rabbitTemplate.convertAndSend(exchangeName,"red",msg); //两个队列都能收到该消息 rabbitTemplate.convertAndSend(exchangeName,"blue",msg); //只有direct.queue1队列能收到该消息 rabbitTemplate.convertAndSend(exchangeName,"yellow",msg); //只有direct.queue2队列能收到该消息 }
5、结果显示
三、 Topic(主题)交换机
TopicExchange与DirectExchange类似,区别在于routingKey可以是多个单词的列表,并且以 . 分割。
Queue与Exchange指定BindingKey时可以使用通配符:
# :代指0个或多个单词
* :代指一个单词案例:利用SpringAMQP演示DirectExchange的使用
需求如下:- 在RabbitMQ控制台中,声明队列topic.queue1和topic.queue2
- 在RabbitMQ控制台中,声明交换机hmall.topic ,将两个队列与其绑定
- 在consumer服务中,编写两个消费者方法,分别监听topic.queue1和topic.queue2
- 在publisher中编写测试方法,利用不同的RoutingKey向hmall.topic发送消息
1、控制台声明队列
2、控制台声明交换机
2.1、声明交换机
2.2、绑定交换机并配置key
3、编写模拟消息消费者
@RabbitListener(queues = "topic.queue1") //监听的队列:topic.queue1 public void listenTopicQueue1(String msg) { System.out.println("消费者1 收到消息:【"+msg+"】"); } @RabbitListener(queues = "topic.queue2") //监听的队列:topic.queue2 public void listenTopicQueue2(String msg) { System.out.println("消费者2 收到消息:【"+msg+"】"); }
4、编写模拟消息发送者
@Test void testSendTopic(){ String exchangeName = "hmall.topic"; String msg = "hello, topic 日本的新闻"; rabbitTemplate.convertAndSend(exchangeName,"china.news",msg); //两个队列都能收到该消息 rabbitTemplate.convertAndSend(exchangeName,"china.weather",msg); //topic.queue1队列能收到该消息 rabbitTemplate.convertAndSend(exchangeName,"japan.news",msg); //topic.queue2队列能收到该消息 }
5、结果显示
Direct交换机与Topic交换机的差异!
- Topic交换机接收的消息RoutingKey可以是多个单词,以 . 分割
- Topic交换机与队列绑定时的bindingKey可以指定通配符
- # : 代表0个或多个词
- * : 代表1个词
猜你喜欢
- 4小时前HDFS 原理 详解
- 4小时前基于Java Web的图书管理系统的设计与实现
- 4小时前ImageNet Classification with Deep Convolutional 论文笔记
- 4小时前【论文阅读】One For All: Toward Training One Graph Model for All Classification Tasks
- 4小时前kafka基础知识总结
- 4小时前kafka服务器连接出现:[NetworkClient.java:935] [Producer clientId=producer-1] Node -1 disconnected原因分析
- 4小时前【车载开发系列】诊断故障码DTC中的扩展数据信息
- 2小时前段子特仑苏什么意思(特仑苏 段子)
- 1小时前tnf羽绒服(tnf羽绒服充绒量多少克)
- 1小时前准备好了吗英文(准备好了吗英文咋说)
网友评论
- 搜索
- 最新文章
- 热门文章