本文讲解DirectExchange
直连型交换机,根据消息携带的路由键将消息投递给对应队列。
大致流程,有一个队列绑定到一个直连交换机上,同时赋予一个路由键 routing key 。
然后当一个消息携带着路由值为X,这个消息通过生产者发送给交换机时,交换机就会根据这个路由值X去寻找绑定值也是X的队列。
1.在发布者publisher服务中向交换机发送消息
交换机名称是badianboke.direct
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringAmqpTest {
//发送到交换机
@Test
public void testSendDirectExchange(){
String exchangeName = "badianboke.direct";
String message = "hello badianboke.com";
rabbitTemplate.convertAndSend(exchangeName, "red", message);
}
}
2.在消费者consumer服务中监听两个队列并接收消息
cn/badianboke/mq/listener/SpringRabbitListener.java
package cn.badianboke.mq.listener;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import java.time.LocalTime;
@Component
public class SpringRabbitListener {
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "direct.queue1"),
exchange = @Exchange(name = "badianboke.direct"),
key = {"red", "blue"}
))
public void listenDirectQueue1(String message){
System.err.println("Consumer1 Received direct.queue1 Message: " + message + " / " + LocalTime.now());
}
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "direct.queue2"),
exchange = @Exchange(name = "badianboke.direct"),
key = {"red", "yellow"}
))
public void listenDirectQueue2(String message){
System.err.println("Consumer2 Received direct.queue2 Message: " + message + " / " + LocalTime.now());
}
}
打开RabbitMq控制台,可以看到
一个交换机badianboke.direct
两个队列direct.queue1
和direct.queue2
绑定关系
3.运行服务可以看到消费者接收到消息
绑定blue的时候,只能看到direct.queue1
消费
绑定red的时候,能看到两个队列都消费了