Fanout交换机
Fanout,英文翻译是扇出,我觉得在MQ中叫广播更合适。
在广播模式下,消息发送流程是这样的:
- 1) 可以有多个队列
- 2) 每个队列都要绑定到Exchange(交换机)
- 3) 生产者发送的消息,只能发送到交换机
- 4) 交换机把消息发送给绑定过的所有队列
- 5) 订阅队列的消费者都能拿到消息
我们的计划是这样的:
- 创建一个名为
hmall.fanout
的交换机,类型是Fanout
- 创建两个队列
fanout.queue1
和fanout.queue2
,绑定到交换机hmall.fanout
3.5.1.声明队列和交换机(案例练习)
利用SpringAMQP演示FanoutExchange的使用
在控制台创建队列fanout.queue1
:
在创建一个队列fanout.queue2
:
然后再创建一个交换机:
然后绑定两个队列到交换机:
3.5.2.消息发送
在publisher服务的SpringAmqpTest类中添加测试方法:
/**
* 向新声明的交换机发送消息(hmall.fanout)
*/
@Test
public void testFanoutExchange() {
// 交换机名称
String exchangeName = "hmall.fanout";
// 消息
String message = "hello, everyone!";
rabbitTemplate.convertAndSend(exchangeName, null, message);
}
3.5.3.消息接收
在consumer服务的SpringRabbitListener中添加两个方法,作为消费者:
/**
* 接受hmall.fanout的消息
* @param msg
*/
@RabbitListener(queues = "fanout.queue1")
public void listenFanoutQueue1(String msg) {
System.out.println("消费者1所在的fanout.queue1接收到Fanout消息:【" + msg + "】");
}
/**
* 接受hmall.fanout的消息
* @param msg
*/
@RabbitListener(queues = "fanout.queue2")
public void listenFanoutQueue2(String msg) {
System.out.println("消费者2所在的fanout.queue2接收到Fanout消息:【" + msg + "】");
}
3.5.4.总结
交换机的作用是什么?
- 接收publisher发送的消息
- 将消息按照规则路由到与之绑定的队列
- 不能缓存消息,路由失败,消息丢失
- FanoutExchange的会将消息路由到每个绑定的队列