前言:這可能將會是關(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)屬性。
?。?)客戶端聲明一個queue,并設(shè)置相關(guān)屬性。
?。?)客戶端使用routing key,在exchange和queue之間建立好綁定關(guān)系。
?。?)客戶端投遞消息到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的默認(rèn)Exchange上。
3.1 如果不使用默認(rèn)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都是默認(rèn)的,那么則可省略,即像代碼中那樣就OK了;如果你是自己搭建的后臺服務(wù),則使用注釋掉的那一行就行。
此處參數(shù)需要注意的是:amqp是不經(jīng)過SSL或者TLS認(rèn)證的,amqps則是需要SSL或者TLS認(rèn)證的,這個地方一定要注意了,因為坑了我啊。。也怪我自己眼神不好,沒看清。。。兩個方法的詳細(xì)說明,可以在庫文件里面看到,這里就不列舉出來了。
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)閉連接?。?!敲黑板?。。?/em>
運行程序后,我們就會收到消息了。
好了,那么這篇文章就完了。
參考資料: