1. channel.exchangeDeclare()
參數(shù):
exchange:交換機(jī)名稱
type:
fanout
fanout類型的Exchange路由規(guī)則非常簡(jiǎn)單,它會(huì)把所有發(fā)送到該Exchange的消息路由到所有與它綁定的Queue中
direct
direct類型的Exchange路由規(guī)則也很簡(jiǎn)單脑豹,它會(huì)把消息路由到那些binding key與routing key完全匹配的Queue中落竹。
topic
規(guī)則就是模糊匹配膝蜈,可以通過(guò)通配符滿足一部分規(guī)則就可以傳送熬甫。它的約定是:
routing key為一個(gè)句點(diǎn)號(hào)“. ”分隔的字符串(我們將被句點(diǎn)號(hào)“. ”分隔開(kāi)的每一段獨(dú)立的字符串稱為一個(gè)單詞)粟耻,如“stock.usd.nyse”夕冲、“nyse.vmw”、“quick.orange.rabbit” binding key與routing key一樣也是句點(diǎn)號(hào)“. ”分隔的字符串嘶炭。
binding key中可以存在兩種特殊字符“”與“#”抱慌,用于做模糊匹配,其中“”用于匹配一個(gè)單詞眨猎,“#”用于匹配多個(gè)單詞(可以是零個(gè))
durable:是否開(kāi)啟持久化exchange
autoDelete: 當(dāng)已經(jīng)沒(méi)有消費(fèi)者時(shí)抑进,服務(wù)器是否可以刪除該exchange
arguments: 擴(kuò)展參數(shù)
Exchange.DeclareOk exchangeDeclare(String exchange, String type, boolean durable, boolean autoDelete,
Map<String, Object> arguments) throws IOException;
2. channel.basicQos()
參數(shù):
prefetchSize:消息的大小
prefetchCount:會(huì)告訴RabbitMQ不要同時(shí)給一個(gè)消費(fèi)者推送多于N個(gè)消息,即一旦有N個(gè)消息還沒(méi)有ack睡陪,則該consumer將block掉单匣,直到有消息ack
global:是否將上面設(shè)置應(yīng)用于channel,簡(jiǎn)單點(diǎn)說(shuō)宝穗,就是上面限制是channel級(jí)別的還是consumer級(jí)別
備注:據(jù)說(shuō)prefetchSize 和global這兩項(xiàng)户秤,rabbitmq沒(méi)有實(shí)現(xiàn),暫且不研究
void basicQos(int prefetchSize, int prefetchCount, boolean global) throws IOException;
3. channel.basicPublish()
參數(shù):
exchange:名稱
routingKey:路由鍵逮矛,#匹配0個(gè)或多個(gè)單詞鸡号,*匹配一個(gè)單詞,在topic exchange做消息轉(zhuǎn)發(fā)用
mandatory:為true時(shí)如果exchange根據(jù)自身類型和消息routeKey無(wú)法找到一個(gè)符合條件的queue须鼎,那么會(huì)調(diào)用
basic.return方法將消息返還給生產(chǎn)者鲸伴。為false時(shí)出現(xiàn)上述情形broker會(huì)直接將消息扔掉
immediate:為true時(shí)如果exchange在將消息route到queue(s)時(shí)發(fā)現(xiàn)對(duì)應(yīng)的queue上沒(méi)有消費(fèi)者府蔗,那么這條消息不會(huì)放入隊(duì)列中。當(dāng)與消息routeKey關(guān)聯(lián)的所有queue(一個(gè)或多個(gè))都沒(méi)有消費(fèi)者時(shí)汞窗,該消息會(huì)通過(guò)basic.return方法返還給生產(chǎn)者姓赤。
props:需要注意的是BasicProperties.deliveryMode,1:不持久化 2:持久化 這里指的是消息的持久化仲吏,配合channel(durable=true),queue(durable)可以實(shí)現(xiàn)不铆,即使服務(wù)器宕機(jī),消息仍然保留
body:要發(fā)送的信息
void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, BasicProperties props, byte[] body) throws IOException;
4. channel.basicAck()
參數(shù):
deliveryTag:該消息的index
multiple:是否批量處理.true:將一次性ack所有小于deliveryTag的消息
void basicAck(long deliveryTag, boolean multiple) throws IOException;
5. channel.basicNack()
參數(shù):
deliveryTag:該消息的index
multiple:是否批量.true:將一次性拒絕所有小于deliveryTag的消息
requeue:被拒絕的是否重新入隊(duì)列 注意:如果設(shè)置為true 裹唆,則會(huì)添加在隊(duì)列的末端
void basicNack(long deliveryTag, boolean multiple, boolean requeue) throws IOException;
6. channel.basicConsume()
參數(shù):
queue:隊(duì)列名稱
autoAck:是否自動(dòng)ack誓斥,如果不自動(dòng)ack,需要使用channel.ack许帐、channel.nack劳坑、channel.basicReject 進(jìn)行消息應(yīng)答
callback:回調(diào)函數(shù)
String basicConsume(String queue, boolean autoAck, Consumer callback) throws IOException;
7. chanel.exchangeBind()
參數(shù):
生產(chǎn)者發(fā)送消息到source交換器中,source根據(jù)路由鍵找到與其匹配的另一個(gè)交換器destination成畦,并把消息轉(zhuǎn)發(fā)到destination中距芬,存儲(chǔ)在destination綁定的隊(duì)列queue中
Exchange.BindOk exchangeBind(String destination, String source, String routingKey) throws IOException;
8. channel.queueDeclare()
參數(shù):
queue: 隊(duì)列名稱
durable: 是否持久化, 隊(duì)列的聲明默認(rèn)是存放到內(nèi)存中的,如果rabbitmq重啟會(huì)丟失循帐,如果想重啟之后還存在就要使隊(duì)列持久化框仔,保存到Erlang自帶的Mnesia數(shù)據(jù)庫(kù)中,當(dāng)rabbitmq重啟之后會(huì)讀取該數(shù)據(jù)庫(kù)
exclusive:是否排外的惧浴,有兩個(gè)作用,一:當(dāng)連接關(guān)閉時(shí)connection.close()該隊(duì)列是否會(huì)自動(dòng)刪除奕剃;二:該隊(duì)列是否是私有的private衷旅,如果不是排外的,可以使用兩個(gè)消費(fèi)者都訪問(wèn)同一個(gè)隊(duì)列纵朋,沒(méi)有任何問(wèn)題柿顶,如果是排外的,會(huì)對(duì)當(dāng)前隊(duì)列加鎖操软,其他通道channel是不能訪問(wèn)的嘁锯,如果強(qiáng)制訪問(wèn)會(huì)報(bào)異常,一般等于true的話用于一個(gè)隊(duì)列只能有一個(gè)消費(fèi)者來(lái)消費(fèi)的場(chǎng)景
autodelete:當(dāng)沒(méi)有任何消費(fèi)者使用時(shí)聂薪,自動(dòng)刪除該隊(duì)列
arguments:擴(kuò)展參數(shù)家乘。如:x-message-ttl
Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,
Map<String, Object> arguments) throws IOException;
9. channel.queueBind()
參數(shù):
queue 隊(duì)列名稱
exchange 交換機(jī)名稱
routingKey 路由key
AMQP.Queue.BindOk queueBind(String queue , String exchange , String routingKey ) throws IOException;