1、前言
我们在rabbitMq的时候经常会用到exchange来分发我们的消息,在使用exchange的时候要了解其常见的三种模式:
- fanout模式
- direct模式
- topic模式
2、exchange的fanout模式
这个模式的要点是:忽略routing key,将消息发送到绑定到交换机的所有队列中
fanout 例子
交换机为:zhanghanlun
其绑定的状态为:
生产者的代码如下:
@Service
public class Producer {
@Autowired
private AmqpTemplate amqpTemplate;
public void send(){
String context = "hello world";
String exchange = "zhanghanlun";
String routingKey = "zhang";
System.out.println("Sender:"+context);
this.amqpTemplate.convertAndSend(exchange,routingKey,context);
}
消费者代码
1、对列"zhanghanlun"
@Component
@RabbitListener(queues = "zhanghanlun")
public class Consumer {
@RabbitHandler
public void process(String context) {
System.out.println("Consumer——zhanghanlun receive message: " + context);
}
}
2、对列“chengwenxiu”
@Component
@RabbitListener(queues = "chengwenxiu")
public class Consumer1 {
@RabbitHandler
public void process(String context){
System.out.println("Consumer——chengwenxiu receive message: "+context);
}
}
当生产者发送消息的时候,对列“zhanghanlun”和对列“zhanghanlun”都收到了消息
Sender:hello world
Consumer——zhanghanlun receive message: hello world
Consumer——chengwenxiu receive message: hello world
3、exchange的direct模式
这个模式的要点是:精确匹配routing key,将消息发送到绑定到交换机的指定队列中
direct 例子
交换机为:zhanghanlun
绑定的状态如下:
生产者和消费者的代码还是不变如上,其结果为:只有对列”zhanghanlun“能收到消息
Sender:hello world
Consumer——zhanghanlun receive message: hello world
4、exchange的topic模式
这个模式的要点是:模糊匹配routing key,将消息发送到绑定到交换机的指定队列中
- *(星号) 用来表示一个单词.
- #(井号) 用来表示任意数量(零个或多个)单词。
topic 例子
交换机为:zhanghanlun
绑定的状态如下:
生产者代码
@Service
public class Producer {
@Autowired
private AmqpTemplate amqpTemplate;
public void send(){
String context = "hello world";
String exchange = "zhanghanlun";
String routingKey = "zhang.hhh";
System.out.println("Sender:"+context);
this.amqpTemplate.convertAndSend(exchange,routingKey,context);
}
}
结果:只有对列”zhanghanlun“收到消息
Sender:hello world
Consumer——zhanghanlun receive message: hello world
5、总结
exchange的模式总结一下如下:
- fanout模式:忽略routing key,将消息发送到绑定到交换机的所有队列中
- direct模式:精确匹配routing key,将消息发送到绑定到交换机的指定队列中
- topic模式:模糊匹配routing key,将消息发送到绑定到交换机的指定队列中