前幾天忙別的事,沒(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ō)明:
-
[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)定義。 - 在聲明隊(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地址。