前言:這可能將會是關(guān)于RabbitMQ的一系列文章,博主也是剛接觸,許多東西也不是很懂硝枉,如有錯誤,還請指正倦微。
一妻味、安裝RabbitMQ Management
如果有后臺已經(jīng)幫你搭好了環(huán)境,你可以跳過這一步璃诀。
- 使用Mac終端,輸入
brew install rabbitmq
蔑匣,則可以安裝RabbitMQ了劣欢,Mac端安裝還是比較容易的棕诵。這里需要注意的是,你可能需要安裝Homebrew這個工具凿将,關(guān)于如何安裝請自行查找相關(guān)文章校套,本篇不再說明。 - 使用瀏覽器牧抵,在網(wǎng)址欄輸入
localhost:15672
笛匙,如果你看到下圖,那么說明你安裝成功犀变。
二妹孙、集成RMQClient
- 在podfile里面輸入pod RMQClient
pod install
三、Hello World
首先來了解幾個概念获枝,下面是百度百科的資料:
Broker:簡單來說就是消息隊列服務(wù)器實體蠢正。
Exchange:消息交換機,它指定消息按什么規(guī)則省店,路由到哪個隊列嚣崭。
Queue:消息隊列載體,每個消息都會被投入到一個或多個隊列懦傍。
Binding:綁定雹舀,它的作用就是把exchange和queue按照路由規(guī)則綁定起來。
Routing Key:路由關(guān)鍵字粗俱,exchange根據(jù)這個關(guān)鍵字進行消息投遞说榆。
vhost:虛擬主機,一個broker里可以開設(shè)多個vhost源梭,用作不同用戶的權(quán)限分離娱俺。
producer:消息生產(chǎn)者,就是投遞消息的程序废麻。
consumer:消息消費者荠卷,就是接受消息的程序。
channel:消息通道烛愧,在客戶端的每個連接里油宜,可建立多個channel,每個channel代表一個會話任務(wù)怜姿。
消息隊列的使用過程大概如下:
(1)客戶端連接到消息隊列服務(wù)器慎冤,打開一個channel。
〔茁(2)客戶端聲明一個exchange蚁堤,并設(shè)置相關(guān)屬性。
〉痢(3)客戶端聲明一個queue披诗,并設(shè)置相關(guān)屬性撬即。
(4)客戶端使用routing key呈队,在exchange和queue之間建立好綁定關(guān)系剥槐。
(5)客戶端投遞消息到exchange宪摧。
exchange接收到消息后粒竖,就根據(jù)消息的key和已經(jīng)設(shè)置的binding,進行消息路由几于,將消息投遞到一個或多個隊列里蕊苗。
exchange也有幾個類型,完全根據(jù)key進行投遞的叫做Direct交換機孩革,例如岁歉,綁定時設(shè)置了routing key為”abc”,那么客戶端提交的消息膝蜈,只有設(shè)置了key為”abc”的才會投遞到隊列锅移。對key進行模式匹配后進行投遞的叫做Topic交換機,符號”#”匹配一個或多個詞饱搏,符號””匹配正好一個詞非剃。例如”abc.#”匹配”abc.def.ghi”,”abc.”只匹配”abc.def”推沸。還有一種不需要key的备绽,叫做Fanout交換機,它采取廣播模式鬓催,一個消息進來時肺素,投遞到與該交換機綁定的所有隊列。
我們做完上面的準(zhǔn)備工作宇驾,那么就可以開始擼代碼了倍靡。
在你的ViewController文件里包含頭文件,#import <RMQClient/RMQClient.h>
课舍,然后寫一個發(fā)送一個接收的方法塌西。
3.1 發(fā)送方法
- (void)send
{
RMQConnection * conn = [[RMQConnection alloc] initWithUri:@"amqp://wubb:123456@192.168.76.78" delegate:[RMQConnectionDelegateLogger new]];
// RMQConnection * conn = [[RMQConnection alloc] initWithDelegate:[RMQConnectionDelegateLogger new]];
[conn start];
id<RMQChannel>channel = [conn createChannel];
RMQQueue * queue = [channel queue:@"hello"];
[channel.defaultExchange publish:[@"hello world" dataUsingEncoding:NSUTF8StringEncoding] routingKey:queue.name];
[conn close];
}
在上段代碼中:
- 我們創(chuàng)建了一個連接,然后開始連接打開一個通道筝尾;
- 我們聲明了一個隊列捡需,并建立了隊列與通道之間的關(guān)系。
- 我們使用routingKey將消息發(fā)送到了channel的默認Exchange上筹淫。
3.1 如果不使用默認Exchange站辉,那么我們則可以自己創(chuàng)建一個Exchange。
3.2 創(chuàng)建好Exchange后,使用routingkey將queue和Exchange建立綁定關(guān)系饰剥。
3.3 發(fā)送消息狸相。
在這段代碼里面,需要注意的是捐川,如果你的控制臺也就是后臺服務(wù)是由別的同事搭的,你需要連接他的后臺逸尖,那么你應(yīng)該使用代碼中我沒有注釋的那一行古沥,帶上URi參數(shù)過去,參數(shù)格式是:amqp(amqps)://賬號:密碼@主機(IP或域名):端口/vhost 娇跟,如果后臺服務(wù)的端口和vhost都是默認的岩齿,那么則可省略,即像代碼中那樣就OK了苞俘;如果你是自己搭建的后臺服務(wù)盹沈,則使用注釋掉的那一行就行。
此處參數(shù)需要注意的是:amqp是不經(jīng)過SSL或者TLS認證的吃谣,amqps則是需要SSL或者TLS認證的乞封,這個地方一定要注意了,因為坑了我啊岗憋。肃晚。也怪我自己眼神不好,沒看清仔戈。关串。。兩個方法的詳細說明监徘,可以在庫文件里面看到晋修,這里就不列舉出來了。
3.2 接收方法
- (void)receive
{
RMQConnection * conn = [[RMQConnection alloc] initWithUri:@"amqp://wubb:123456@192.168.76.78" delegate:[RMQConnectionDelegateLogger new]];
// RMQConnection * conn = [[RMQConnection alloc] initWithDelegate:[RMQConnectionDelegateLogger new]];
[conn start];
id<RMQChannel>channel = [conn createChannel];
RMQQueue * queue = [channel queue:@"hello"];
[queue subscribe:^(RMQMessage * _Nonnull message) {
NSLog(@"message:%@",[[NSString alloc] initWithData:message.body encoding:NSUTF8StringEncoding]);
}];
}
在接收方法的代碼中:
- 創(chuàng)建連接凰盔,并打開通道
- 聲明隊列墓卦,此時的隊列要和發(fā)送中的隊列名相同
- 告訴服務(wù)器,我們訂閱了queue這個隊列的消息廊蜒,當(dāng)服務(wù)器發(fā)送消息時趴拧,那么我們就能在block里面收到這個消息了
此段代碼我們要注意的是,接收不要關(guān)閉連接I蕉!V瘛!敲黑板Fň蟆D杂帧!
運行程序后,我們就會收到消息了问麸。
好了往衷,那么這篇文章就完了。
參考資料: