iOS RMQClient(RabbitMQ)第一章---Hello World

前言:這可能將會是關(guān)于RabbitMQ的一系列文章,博主也是剛接觸,許多東西也不是很懂,如有錯誤,還請指正。

一、安裝RabbitMQ Management

如果有后臺已經(jīng)幫你搭好了環(huán)境,你可以跳過這一步。

  1. 使用Mac終端,輸入brew install rabbitmq,則可以安裝RabbitMQ了,Mac端安裝還是比較容易的。這里需要注意的是,你可能需要安裝Homebrew這個工具,關(guān)于如何安裝請自行查找相關(guān)文章,本篇不再說明。
  2. 使用瀏覽器,在網(wǎng)址欄輸入localhost:15672,如果你看到下圖,那么說明你安裝成功。
正確安裝RabbitMQ

二、集成RMQClient

  1. 在podfile里面輸入pod RMQClient
  2. 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];
}

在上段代碼中:

  1. 我們創(chuàng)建了一個連接,然后開始連接打開一個通道;
  2. 我們聲明了一個隊列,并建立了隊列與通道之間的關(guān)系。
  3. 我們使用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]);
    }];  
}

在接收方法的代碼中:

  1. 創(chuàng)建連接,并打開通道
  2. 聲明隊列,此時的隊列要和發(fā)送中的隊列名相同
  3. 告訴服務(wù)器,我們訂閱了queue這個隊列的消息,當(dāng)服務(wù)器發(fā)送消息時,那么我們就能在block里面收到這個消息了

此段代碼我們要注意的是,接收不要關(guān)閉連接?。?!敲黑板?。。?/em>

運行程序后,我們就會收到消息了。

成功收到消息

好了,那么這篇文章就完了。

參考資料:

  1. RabbitMQ官方指導(dǎo)
  2. iOS RabbitMQ集成及使用

這里是寫完的Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 來源 RabbitMQ是用Erlang實現(xiàn)的一個高并發(fā)高可靠AMQP消息隊列服務(wù)器。支持消息的持久化、事務(wù)、擁塞控...
    jiangmo閱讀 10,380評論 2 34
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • 1. 歷史 RabbitMQ是一個由erlang開發(fā)的AMQP(Advanced Message Queue )的...
    高廣超閱讀 6,114評論 3 51
  • 1 RabbitMQ安裝部署 這里是ErLang環(huán)境的下載地址http://www.erlang.org/down...
    Bobby0322閱讀 2,252評論 0 11
  • 什么叫消息隊列 消息(Message)是指在應(yīng)用間傳送的數(shù)據(jù)。消息可以非常簡單,比如只包含文本字符串,也可以更復(fù)雜...
    lijun_m閱讀 1,363評論 0 1