上篇《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中,定義了一個消息類,用于存儲消息實體和消息的屬性信息。下面是該類的成員變量和方法
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。
通過方法名,我們就很清楚知道每個方法是干什么的,比如isDurable用于判定是否持久化了
getType方法用于得到該Exchange是那種類型,前面我們已經說過,Exchange的類型主要有Direct、Fanout、Topic和Headers四種,相應的,也有四個實現類集成了接口Exchange,他們分別是DirectExchange、FanoutExchange、TopicExchange和HeadersExchange
下面我們看看DirectExchange和Exchange的關系
- 這四個實現類都是繼承了抽象類AbstractExchange,而AbstractExchange也是Exchange的子類。
- DirectExchange的源碼如下,我們可以看到其復寫了getType方法,并賦值為ExchangeTypes.DIRECT
Queue
Queue是用來存儲消息的,消費者從這里拿走消息并消費。與上面提到的Exchange類似,Spring-amqp中也是通過一個類Queue來定義了隊列。
Queue有多種重載形式的構造函數,可以設置queue的名稱,是否持久化,是否自動刪除等等
有一些判斷的函數,比如是否持久化了,是否設置了自動刪除等
Binding
我們應該還記得在原生的RabbitMQ中,Fanout模式下是如何綁定Exchange和Queue的
channel.queueBind(queueName, EXCHANGE_NAME, "");
在Spring-amqp中,即使是綁定映射,也單獨創建了一個類Binding
對于構造函數,后面我們通過幾個例子就可以知道每個參數表示的含義
提供了一些函數用戶獲取綁定兩端Exchange和Queue的基本信息
Direct模式的綁定
new Binding(someQueue, someDirectExchange, "foo.bar")
Fanout模式的綁定
new Binding(someQueue, someFanoutExchange)
Topic模式的綁定
new Binding(someQueue, someTopicExchange, "foo.*")
如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的“推薦”將是我最大的寫作動力!如果您想持續關注我的文章,請掃描二維碼,關注JackieZheng的微信公眾號,我會將我的文章推送給您,并和您一起分享我日常閱讀過的優質文章。
文章列表