概述

Direct Exchange 会将接收到的消息根据规则路由到指定的Queue,因此称为路由模式(routes)。
每一个Queue都与Exchange设置一个BindingKey
发布者发送消息时,指定消息的RoutingKey
Exchange将消息路由到BindingKey与消息RoutingKey一致的队列

image-1655737161447

利用SpringAMQP演示DirectExchange的使用

实现思路如下:

  • 利用@RabbitListener声明Exchange、Queue、RoutingKey
  • 在consumer服务中,编写两个消费者方法,分别监听direct.queue1和direct.queue2
  • 在publisher中编写测试方法,向direct. direct发送消息

绑定关系

在consumer服务中,编写两个消费者方法,分别监听direct.queue1和direct.queue2,
并利用@RabbitListener声明Exchange、Queue、RoutingKey

//交给spring管理
@Component
public class SpringRabbitListener {

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "direct.queue1"),
            exchange = @Exchange(name = "direct.exchange", type = ExchangeTypes.DIRECT),
            key = {"red", "yellow"}
    ))
    public void listenDirectFanout1(String msg) {
        System.out.println("【direct.queue1】:" + msg);
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "direct.queue2"),
            exchange = @Exchange(name = "direct.exchange", type = ExchangeTypes.DIRECT),
            key = {"red", "blue"}
    ))
    public void listenDirectFanout2(String msg) {
        System.out.println("【direct.queue2】:" + msg);
    }

}

测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringAmqpTest {
    @Autowired
    private RabbitTemplate template;

    @Test
    public void testSendDirectExchange() {
        String exchangeName = "direct.exchange";
        String message = "hello yellow !";
        template.convertAndSend(exchangeName, "yellow", message);
        message = "hello blue !";
        template.convertAndSend(exchangeName, "blue", message);
        message = "hello red !";
        template.convertAndSend(exchangeName, "red", message);
    }
}

结果显而易见,blue消息只会被队列2收到,yellow消息只会被队列1收到,red信息会被两个队列都收到:

image-1655737433702

总结

描述下Direct交换机与Fanout交换机的差异?

  • Fanout交换机将消息路由给每一个与之绑定的队列
  • Direct交换机根据RoutingKey判断路由给哪个队列
  • 如果多个队列具有相同的RoutingKey,则与Fanout功能类似

基于@RabbitListener注解声明队列和交换机有哪些常见注解?

  • @Queue
  • @Exchange