天天看點

SpringAMQP DirectExchange實作釋出/訂閱

在Fanout模式中,一條消息,會被所有訂閱的隊列都消費。但是,在某些場景下,我們希望不同的消息被不同的隊列消費。這時就要用到Direct類型的Exchange。

SpringAMQP DirectExchange實作釋出/訂閱
在Direct模型下:

  • 隊列與交換機的綁定,不能是任意綁定了,而是要指定一個

    RoutingKey

    (路由key)
  • 消息的發送方在 向 Exchange發送消息時,也必須指定消息的

    RoutingKey

  • Exchange不再把消息交給每一個綁定的隊列,而是根據消息的

    Routing Key

    進行判斷,隻有隊列的

    Routingkey

    與消息的

    Routing key

    完全一緻,才會接收到消息

1.基于注解聲明隊列和交換機

基于@Bean的方式聲明隊列和交換機比較麻煩,Spring還提供了基于注解方式來聲明。

在consumer的SpringRabbitListener中添加兩個消費者,同時基于注解來聲明隊列和交換機:

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "direct.queue1"),
    exchange = @Exchange(name = "direct.change", type = ExchangeTypes.DIRECT),
    key = {"red", "blue"}
))
public void listenDirectQueue1(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", "yellow"}
))
public void listenDirectQueue2(String msg){
    System.out.println("消費者接收到direct.queue2的消息:【" + msg + "】");
}
      

  

2.消息發送

@Test
public void testSendDirectExchange() {
    // 交換機名稱
    String exchangeName = "direct.exchange";
    // 消息
    String message = "紅色警報!日本亂排核廢水,導緻海洋生物變異,驚現哥斯拉!";
    // 發送消息
    rabbitTemplate.convertAndSend(exchangeName, "red", message);
}
      

3.總結

描述下Direct交換機與Fanout交換機的差異?

  • Fanout交換機将消息路由給每一個與之綁定的隊列
  • Direct交換機根據RoutingKey判斷路由給哪個隊列
  • 如果多個隊列具有相同的RoutingKey,則與Fanout功能類似

基于@RabbitListener注解聲明隊列和交換機有哪些常見注解?