iOS RMQClient(RabbitMQ)第二章---廣播模式接收多個(gè)消息

前幾天忙別的事,沒(méi)時(shí)間寫,現(xiàn)在補(bǔ)上。
在上一章中,我們集成了RMQClient,并進(jìn)行了一些基礎(chǔ)操作,這一章來(lái)講講廣播模式接收多個(gè)消息。
有一種場(chǎng)景是,我發(fā)出一條消息,需要多個(gè)人收到,但我并不在乎是哪一些人收到。例如老板說(shuō),今天不用上班,那全公司的人就都收到了。
了解了基礎(chǔ)需求后,我們開(kāi)始干活兒。

一、接收方法

- (void)receive
{
    RMQConnection * connection = [[RMQConnection alloc] initWithDelegate:[RMQConnectionDelegateLogger new]];
    [connection start];
    id<RMQChannel> channel = [connection createChannel];
    //options 為聲明屬性,斷開(kāi)連接后自動(dòng)刪除
    RMQQueue * queue = [channel queue:@"" options:RMQQueueDeclareAutoDelete];
    RMQExchange * exchange = [channel fanout:self.exTF.text options:RMQExchangeDeclareAutoDelete];
    [queue bind:exchange];
    [queue subscribe:^(RMQMessage * _Nonnull message) {
        NSLog(@"<二>收到消息:%@",[[NSString alloc] initWithData:message.body encoding:NSUTF8StringEncoding]);
    }];
}

說(shuō)明:

  1. [channel fanout:self.exTF.text options:RMQExchangeDeclareAutoDelete] 這行代碼的意思是將通道與交換機(jī)使用self.exTF.text字段進(jìn)行廣播匹配,且在斷開(kāi)時(shí)自動(dòng)刪除該交換機(jī)。
    在RabbitMQ中有4種匹配方式,分別是direct(完全匹配),fanout(廣播匹配)topic(主題匹配)header(標(biāo)題匹配)。
    1.1 廣播匹配,fanout
    這種匹配方式,不需要考慮路由鍵(routingKey),它類似網(wǎng)絡(luò)中的廣播模式,將消息發(fā)送到所有與該exchange綁定的隊(duì)列上,比如你在一個(gè)exchange上綁定了3個(gè)隊(duì)列,分別是q1,q2,q3,你將一條消息發(fā)送給q1,那么q2和q3也將會(huì)收到。
    這種匹配方式必須先綁定一個(gè)隊(duì)列,如果你向一個(gè)沒(méi)有綁定的隊(duì)列發(fā)送了消息,那么這條消息將會(huì)被丟棄
    1.2 完全匹配,direct
    這種匹配方式需要考慮路由鍵(routingKey),它需要將一個(gè)隊(duì)列綁定到交換機(jī)上,要求該消息與隊(duì)列的一個(gè)routingKey完全匹配。如果一個(gè)隊(duì)列接收到消息的時(shí)候,只有匹配了該routingKey的隊(duì)列才會(huì)收到消息。比如,一個(gè)隊(duì)列綁定到該交換機(jī)上,要求routingKey為"banana",那么則只有routingKey為banana的隊(duì)列才能收到消息,既不會(huì)轉(zhuǎn)發(fā)到banana.abc也不會(huì)轉(zhuǎn)發(fā)到banana.abc.edf,也不會(huì)轉(zhuǎn)發(fā)到apple上。
    1.3 主題匹配,topic
    這是一種按照通配符匹配的方式,它不能隨意指定routingKey,它的格式為abc.或者abc.#樣式的字符串,且長(zhǎng)度不能超過(guò)255個(gè)字節(jié),代表匹配一個(gè)單詞,#號(hào)代表多個(gè)單詞(或者0個(gè)),前者可以理解為精確匹配,后者可以理解為模糊匹配。
    1.4 標(biāo)題匹配,header
    這是一種標(biāo)題匹配模式,它不需要字符串類型的routingKey,而是采用鍵值對(duì)進(jìn)行匹配。生產(chǎn)者在發(fā)送消息的時(shí)候設(shè)置一些鍵值對(duì),消費(fèi)者在綁定的時(shí)候設(shè)置一些鍵值對(duì),兩者匹配成功才能接收到消息。它有兩種類型,一種是all,一種是any,all代表全部鍵值對(duì)匹配成功,any代表部分匹配成功。這兩種類型在消費(fèi)者端都必須采用"x-match"來(lái)定義。
  2. 在聲明隊(duì)列的時(shí)候,我沒(méi)有給隊(duì)列名,這是因?yàn)椋覀冃枰粋€(gè)臨時(shí)隊(duì)列,讓生產(chǎn)者把消息發(fā)送到所有隊(duì)列上,而不能指定一個(gè)隊(duì)列。

二、發(fā)送方法

- (void)send
{
    RMQConnection * connection = [[RMQConnection alloc] initWithDelegate:[RMQConnectionDelegateLogger new]];
    [connection start];
    id<RMQChannel> channel = [connection createChannel];
    RMQExchange * exchange = [channel fanout:self.exTF.text options:RMQExchangeDeclareAutoDelete];
    [exchange publish:[self.msgTF.text dataUsingEncoding:NSUTF8StringEncoding]];
    [connection close];
}

說(shuō)明:發(fā)送方法的匹配模式要和接收方法的匹配模式一樣。
這一章結(jié)束。
附上DEMO地址。

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

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,837評(píng)論 18 139
  • 1 RabbitMQ安裝部署 這里是ErLang環(huán)境的下載地址http://www.erlang.org/down...
    Bobby0322閱讀 2,252評(píng)論 0 11
  • 來(lái)源 RabbitMQ是用Erlang實(shí)現(xiàn)的一個(gè)高并發(fā)高可靠AMQP消息隊(duì)列服務(wù)器。支持消息的持久化、事務(wù)、擁塞控...
    jiangmo閱讀 10,380評(píng)論 2 34
  • RabbitMQ 即一個(gè)消息隊(duì)列,主要是用來(lái)實(shí)現(xiàn)應(yīng)用程序的異步和解耦,同時(shí)也能起到消息緩沖,消息分發(fā)的作用。 消息...
    彩虹之夢(mèng)閱讀 1,091評(píng)論 2 1
  • 哈嘍哈~大家好,我只是單純的來(lái)一波水彩分享,自己還是個(gè)技術(shù)渣,工具用的也不是什么牌子的。等工具買齊了再來(lái)轟炸! 1...
    丨Sherry丨閱讀 511評(píng)論 3 4