一、fanout交换机
该交换机为广播类型,收到的消息将会广播给与其绑定的所有队列,先在控制台创建名为“noop.fanout”的交换机,再绑定两个队列,分别是“fanout,queue1”和“fanout.queue2”
测试代码如下:
消息发送:
@Test
void MQtest() throws InterruptedException {
String exchangeName ="noop.fanout";
String msg = "hello,everyone";
rabbitTemplate.convertAndSend(exchangeName,null ,msg);
}
消息接收:
@RabbitListener(queues = "fanout.queue1")
public void listenSimple1(String msg){
System.out.println("一号收到消息:"+msg+"。");
}
@RabbitListener(queues = "fanout.queue2")
public void listenSimple2(String msg){
System.out.println("二号收到消息:"+msg+"。");
}
结果:
二、direct交换机
该交换机为定向交换机,根据Key将对应的消息发送到对应的队列中,可以通过设置达到fanout交换机的效果
(1)每一个queue应设置一个BindingKey
(2)发布消息时设定routingkey
(3) 交换机将会把消息路由到Bindingkey和routingkey相同的队列中
首先在控制台进行交换机和队列的创建,在交换机与队列进行bind时添加routingkey
代码如下:
发送者(Key:red):
@Test
void MQtest() throws InterruptedException {
String exchangeName ="noop.direct";
String msg = "该消息为red,所有队列都有该key,都应收到";
rabbitTemplate.convertAndSend(exchangeName,"red" ,msg);
}
消费者:
@RabbitListener(queues = "direct.queue1")
public void listenSimple1(String msg){
System.out.println("一号收到消息:"+msg+"。");
}
@RabbitListener(queues = "direct.queue2")
public void listenSimple2(String msg){
System.out.println("二号收到消息:"+msg+"。");
}
结果:
使用其他key(yellow,blue)同理。
三、Topic交换机
根据某种规则发放消息的交换机,与direct交换机不同于,其routingkey可以是多个单词的列表,使用 . 号进行分割。(该模式是最灵活的交换机,也是最推荐使用的)
可以使用通配符:
#:代表0或多个单词。(例如china.# 可以找到 china.的所有东西,包括china.a.b、china.a.b.c或是更多)
*:代表一个单词。(例如china.* 只能找到china.a或是china.b而不能找到更多)
首先在控制台进行创建 (不再赘述)
绑定key如下:
代码实例如下:
发送者:
@Test
void MQtest() throws InterruptedException {
String exchangeName ="noop.topic";
String msg = "新闻,只有二号能收到";
rabbitTemplate.convertAndSend(exchangeName,"US.news" ,msg);
}
生产者:
@RabbitListener(queues = "topic.queue1")
public void listenSimple1(String msg){
System.out.println("一号收到消息:"+msg+"。");
}
@RabbitListener(queues = "topic.queue2")
public void listenSimple2(String msg){
System.out.println("二号收到消息:"+msg+"。");
}
结果: