1. 程式人生 > 其它 >SpringAMQP DirectExchange實現釋出/訂閱

SpringAMQP DirectExchange實現釋出/訂閱

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

在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註解宣告佇列和交換機有哪些常見註解?

  • @Queue

  • @Exchange