前幾天忙別的事尚卫,沒(méi)時(shí)間寫(xiě)企孩,現(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地址娜庇。