3.使用交換器和隊列

文章參考:Rabbit實戰(zhàn)指南

聲明一個交換器和隊列
channel.exchangeDeclare(exchangeName,"direct",true);
String queueName = channel.queueDeclare().getQueue();
channel.queueBind(queueName,exchangeName,routingKey);

上面創(chuàng)建了一個持久化的姥芥、非自動刪除的戒劫、綁定類型為direct的交換器凿菩,同時創(chuàng)建了一個非

持久化的、排他的客情、自動刪除的隊列(此隊列名稱由RabbitMQ自動生成)其弊。這里的交換器和隊列也沒有設置特殊的參數。

上面代碼也展示了如何使用路由鍵將隊列和交換器綁定起來膀斋。上面聲明的隊列具有如下特性:

只對當前應用中同一個Connection層面可用梭伐,同一個Connection的的不同Channel可共用,并且會在應用連接斷開時自動刪除仰担。

如果要在應用中共享一個隊列籽御,可以做如下聲明

channel.exchangeDeclare(exchangeName,"direct",true);
channel.queueDeclare(queueName,true,false,false,null);
channel.queueBind(queueName,exchangeName,routingKey);

隊列被聲明為持久化的、非排他的惰匙、非自動刪除的技掏,而且也被分配到另一個確定的已知的名稱。

exchangeDeclare方法

exchangeDeclare有多個重載方法项鬼,這些重載方法都是由下面這個方法中缺省的某些參數構成的哑梳。

Exchange.DeclareOk exchangeDeclare(String exchange,String type,boolean durable,boolean autoDelete,boolean internal,
 Map<String,Object> arguments) throws IOException;

這個方法返回值是Exchange.DeclareOK,用來標識成功聲明了一個交換器绘盟。

  • exchange:交換器名稱
  • type:交換器類型鸠真,常見的如fanout、direct龄毡、topic
  • durable:設置是否持久化吠卷。durable設置為true標識持久化,反之是非持久化沦零。持久化可以將交換器存盤祭隔,在服務器重啟的時候不會丟失相關信息。
  • autoDelete:設置是否自動刪除路操。autoDelete設置為true則表示自動刪除疾渴。自動刪除的前提是至少有一個隊列或者交換器與這個交換器綁定,之后所有與這個交換器綁定的隊列或者交換器都與此解綁屯仗。
  • internal:設置是否內置的搞坝。如果設置為true,則表示是內置的交換器魁袜,客戶端程序無法直接發(fā)送消息到這個交換器中桩撮,只能通過交換器路由到交換器這種方式敦第。
  • argument:其他一些結構化參數,比如alternate-exchange店量。
queueDeclare方法

queueDeclare只有兩個重載方法

Queue.DeclareOk queueDeclare() throws IOException;
Queue.DeclareOk queueDeclare(String queue, boolean durable, 
                             boolean exclusive,boolean autoDelete
                             Map<String,Object> arguments) throws IOException;

不帶任何參數的queueDeclare方法默認創(chuàng)建一個由RabbitMQ命名申尼、排他的、自動刪除的垫桂、非持久化的隊列。

方法參數:

  • queue:隊列名稱
  • durable:設置是否持久化粟按。為true則設置隊列為持久化诬滩。持久化的隊列會存盤,在服務器重啟的時候可以保證不丟失相關信息灭将。
  • exclusive:設置是否排他疼鸟。為true則設置隊列為排他的。如果一個隊列被聲明為排他隊列庙曙,該隊列僅對首次聲明它的連接可見空镜,并在連接斷開時自動刪除。
    • 注意:
    • 排他隊列是基于連接可見的捌朴,同一個連接(connection)的不同信道(channel)是可以同時訪問同一連接創(chuàng)建的排他隊列吴攒;
    • “首次”是指如果一個連接已經聲明了一個排他隊列,其他連接時不允許建立同名的排他隊列的砂蔽,這個與普通隊列不同
    • 即使該隊列是持久化的洼怔,一旦連接關閉或者客戶端退出,該排他隊列都會被自動刪除左驾,這種隊列適合用于一個客戶端同時發(fā)送和讀取消息的場景镣隶。
  • autoDelete:設置是否自動刪除。為true則設置隊列為自動刪除诡右。自動刪除的前提是:至少有一個消費者連接到這個隊列安岂,之后所有與這個隊列連接的消費者都斷開時,才會自動刪除帆吻。不能把這個參數錯誤地理解為:“當連接到此隊列的所有客戶端斷開時域那,這個隊列自動刪除”,因為生產者客戶端創(chuàng)建這個隊列猜煮,或者沒有消費者客戶端與這個隊列連接時琉雳,都不會自動刪除這個隊列。
  • argument:設置隊列的其他一些參數友瘤,如x-message-ttl翠肘、x-expires、x-max-length等
注意要點:

? 生產者和消費者都可以使用queueDeclare來聲明一個隊列辫秧,但是如果消費者在同一個信道上訂閱了另一個隊列束倍,就無法再聲明隊列了。必須先取消訂閱,然后將信道設置為“傳輸”模式绪妹,之后才能聲明隊列

queueBind方法

? 將隊列和交換器綁定的方法如下甥桂,可以與前兩節(jié)中的方法定義進行類比。

//(1)
Queue.BindOk queueBind(String queue,String exchange,String routingKey) throws IOException;
//(2)
Queue.BindOk queueBind(String queue,String exchange,String routingKey,Map<String,Object> arguments) throws IOException;
//(3)
void queueBindNoWait(String queue,String exchange,String routingKey,Map<String,Object> arguments) throws IOException;

方法參數詳解:

  • queue:隊列名稱
  • exchange:交換機名稱
  • routingKey:用來綁定隊列和交換機的路由鍵
  • argument:定義綁定的一些參數

不僅可以將隊列和交換器綁定起來邮旷,也可以將被綁定的隊列和交換器進行解綁黄选。方法如下:

//(1) 
Queue.UnbindOk queueUnbind(String queue,String exchange,String routingKey) throws IOException;
//(2)
Queue.UnbindOk queueUnbind(String queue,String exchange,Stirng routingKey,Map<String,Object> argument) throws IOException;
exchangeBind 方法

? 不僅可以將交換機與隊列綁定,也可以將交換器與交換器綁定婶肩,后者和前者的用法如出一轍办陷。方法如下:

//(1)
Exchange.BinOk exchangeBind(String destination,String source, String routingKey)throws IOException;
//(2)
Exchange.BinOk exchangeBind(String destination,String source, String routingKey,Map<String,Object> arguments)throws IOException;
//(3)
void exchangeBindNoWait(String destination,String source,String routingKey, Map<String,Object> arguments) throws IOException;

? 綁定之后,消息從source交換器轉發(fā)到destination交換器律歼,某種程度上說destination交換器可以看做一個隊列民镜。

channel.exchangeDeclare("source","direct",false,true,null);
channel.exchangeDeclare("destination","fanout",false,true,null);
channel.exchangeBind("destination","source","exKey");
channel.queueDeclare("queue",false,false,true,null);
channel.queueBind("queue","destination","");
channel.basicPublish("source","exKey",null,"exToExDemo".getBytes());

生產者發(fā)送消息至交換器source中,交換器source根據路由鍵找到與其匹配的另一個交換器destination中险毁,進而存儲在destination綁定的queue中制圈。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市畔况,隨后出現的幾起案子鲸鹦,更是在濱河造成了極大的恐慌,老刑警劉巖跷跪,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亥鬓,死亡現場離奇詭異,居然都是意外死亡域庇,警方通過查閱死者的電腦和手機嵌戈,發(fā)現死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來听皿,“玉大人熟呛,你說我怎么就攤上這事∥疽蹋” “怎么了庵朝?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長又厉。 經常有香客問我九府,道長,這世上最難降的妖魔是什么覆致? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任侄旬,我火速辦了婚禮,結果婚禮上煌妈,老公的妹妹穿的比我還像新娘儡羔。我一直安慰自己宣羊,他們只是感情好,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布汰蜘。 她就那樣靜靜地躺著仇冯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪族操。 梳的紋絲不亂的頭發(fā)上苛坚,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機與錄音色难,去河邊找鬼泼舱。 笑死,一個胖子當著我的面吹牛莱预,可吹牛的內容都是我干的。 我是一名探鬼主播项滑,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼依沮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了枪狂?” 一聲冷哼從身側響起危喉,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎州疾,沒想到半個月后辜限,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡严蓖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年薄嫡,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颗胡。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡毫深,死狀恐怖,靈堂內的尸體忽然破棺而出毒姨,到底是詐尸還是另有隱情哑蔫,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布弧呐,位于F島的核電站闸迷,受9級特大地震影響,放射性物質發(fā)生泄漏俘枫。R本人自食惡果不足惜腥沽,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鸠蚪。 院中可真熱鬧巡球,春花似錦言沐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至矿筝,卻和暖如春起便,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背窖维。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工榆综, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铸史。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓鼻疮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親琳轿。 傳聞我的和親對象是個殘疾皇子判沟,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內容