Spring整合RabbitMQ-必須知道的幾個概念

weixin_33978044發表於2017-08-12

上篇《Spring整合RabbiMQ-Spring AMQP新特性》我們瞭解了最新spring-rabbit的2.0.0.M5版本相較於之前有哪些變化。其實使用Spring-amqp確實簡單,其主要就一些jar包,比如spring-amqp,spring-rabbit等。這篇就通過幾個基本概念來了解下Spring amqp和原生amqp在用法上有何不同。

訊息體

在《RabbitMQ入門》系列中,我們如果要傳送一條訊息,都是轉成位元組陣列的,類似這樣
channel.basicPublish("", QUEUE_NAME, null, "hello world".getBytes());
但是在spring-amqp中,定義了一個訊息類,用於儲存訊息實體和訊息的屬性資訊。下面是該類的成員變數和方法


4459384-ac49413cdd7ee208
3217000081e4d1970e2e
  • getBody就是獲取訊息體的內容,相當於上面的“hello world”

  • getMessageProperties可以得到有關訊息本身的屬性資訊,比如messageId訊息的id標識,timestamp時間戳等等的值

  • 使用這將上面屬性的值通過setHeader(String key, Object value)方法新增到訊息類中

Exchange

讀過《RabbitMQ入門》系列,想必對於Exchange應該就不會陌生。在RabbitMQ是實際上所有的訊息都不是生產者直接送到消費者,而是需要經過一道Exchange。Exchange接收傳送者傳送的訊息,並根據定好的路由規則將訊息派發到相應的佇列Queue中去,最終被訊息者消費。
在原生的RabbitMQ中,我們通過類似這樣的語句來指定需要使用哪種Exchange型別
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);
顯然,這裡宣告的是Fanout的exchange模式。同時,我們注意到這裡並沒有一個與Exchange直面相關的類,來設定響應的屬性。
在spring-amqp中,就針對Exchange單獨定義了一個介面Exchange。


4459384-3ae9a13c4379d532
321e000006c14bae4033
  • 通過方法名,我們就很清楚知道每個方法是幹什麼的,比如isDurable用於判定是否持久化了

  • getType方法用於得到該Exchange是那種型別,前面我們已經說過,Exchange的型別主要有Direct、Fanout、Topic和Headers四種,相應的,也有四個實現類整合了介面Exchange,他們分別是DirectExchange、FanoutExchange、TopicExchange和HeadersExchange

下面我們看看DirectExchange和Exchange的關係


4459384-9c364b0ea95e0ae5
32000000154e69b3bf3a
  • 這四個實現類都是繼承了抽象類AbstractExchange,而AbstractExchange也是Exchange的子類。
  • DirectExchange的原始碼如下,我們可以看到其複寫了getType方法,並賦值為ExchangeTypes.DIRECT

Queue

Queue是用來儲存訊息的,消費者從這裡拿走訊息並消費。與上面提到的Exchange類似,Spring-amqp中也是通過一個類Queue來定義了佇列。


4459384-b1368344ebd0c03f
320d00000a45a5a469f8
  • Queue有多種過載形式的建構函式,可以設定queue的名稱,是否持久化,是否自動刪除等等

  • 有一些判斷的函式,比如是否持久化了,是否設定了自動刪除等

Binding

我們應該還記得在原生的RabbitMQ中,Fanout模式下是如何繫結Exchange和Queue的
channel.queueBind(queueName, EXCHANGE_NAME, "");
在Spring-amqp中,即使是繫結對映,也單獨建立了一個類Binding


4459384-814d21ea48e14f8a
3217000090abc9b5dde2
  • 對於建構函式,後面我們通過幾個例子就可以知道每個參數列示的含義

  • 提供了一些函式使用者獲取繫結兩端Exchange和Queue的基本資訊

Direct模式的繫結
new Binding(someQueue, someDirectExchange, "foo.bar")
Fanout模式的繫結
new Binding(someQueue, someFanoutExchange)
Topic模式的繫結
new Binding(someQueue, someTopicExchange, "foo.")

如果您覺得閱讀本文對您有幫助,請點一下“
喜歡”按鈕,您的“喜歡*”將是我最大的寫作動力!如果您想持續關注我的文章,請掃描二維碼,關注JackieZheng的微信公眾號,我會將我的文章推送給您,並和您一起分享我日常閱讀過的優質文章。

4459384-f166f03afb66b79f.jpg

相關文章