SpringAMQP DirectExchange實現釋出/訂閱
阿新 • • 發佈:2021-11-03
在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 + "】"); }
@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