文章參考: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中制圈。