RabbitMQ消息隊列中的Channel信道參數詳解
RabbitMQ Channel 參數
1. channel.exchangeDeclare()
參數:
exchange:交換機名稱
type:
fanout
fanout類型的Exchange路由規(guī)則非常簡單,它會把所有發(fā)送到該Exchange的消息路由到所有與它綁定的Queue中
direct
direct類型的Exchange路由規(guī)則也很簡單,它會把消息路由到那些binding key與routing key完全匹配的Queue中。
topic
規(guī)則就是模糊匹配,可以通過通配符滿足一部分規(guī)則就可以傳送。它的約定是: routing key為一個句點號“. ”分隔的字符串(我們將被句點號“. ”分隔開的每一段獨立的字符串稱為一個單詞),如“stock.usd.nyse”、“nyse.vmw”、“quick.orange.rabbit” binding key與routing key一樣也是句點號“. ”分隔的字符串。 binding key中可以存在兩種特殊字符“”與“#”,用于做模糊匹配,其中“”用于匹配一個單詞,“#”用于匹配多個單詞(可以是零個)
durable:是否開啟持久化exchange
autoDelete: 當已經沒有消費者時,服務器是否可以刪除該exchange
arguments: 擴展參數
Exchange.DeclareOk exchangeDeclare(String exchange, String type, boolean durable, boolean autoDelete,Map<String, Object> arguments) throws IOException;
2. channel.basicQos()
參數:
prefetchSize:消息的大小
prefetchCount:會告訴RabbitMQ不要同時給一個消費者推送多于N個消息,即一旦有N個消息還沒有ack,則該consumer將block掉,直到有消息ack
global:是否將上面設置應用于channel,簡單點說,就是上面限制是channel級別的還是consumer級別
備注:據說prefetchSize 和global這兩項,rabbitmq沒有實現,暫且不研究
void basicQos(int prefetchSize, int prefetchCount, boolean global) throws IOException;
3. channel.basicPublish()
參數:
exchange:名稱 routingKey:路由鍵,#匹配0個或多個單詞,*匹配一個單詞,在topic exchange做消息轉發(fā)用
mandatory:為true時如果exchange根據自身類型和消息routeKey無法找到一個符合條件的queue,那么會調用 basic.return方法將消息返還給生產者。為false時出現上述情形broker會直接將消息扔掉 immediate:為true時如果exchange在將消息route到queue(s)時發(fā)現對應的queue上沒有消費者,那么這條消息不會放入隊列中。當與消息routeKey關聯的所有queue(一個或多個)都沒有消費者時,該消息會通過basic.return方法返還給生產者。
props:需要注意的是BasicProperties.deliveryMode,1:不持久化 2:持久化 這里指的是消息的持久化,配合channel(durable=true),queue(durable)可以實現,即使服務器宕機,消息仍然保留
body:要發(fā)送的信息
void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, BasicProperties props, byte[] body) throws IOException;
4. channel.basicAck()
參數:
deliveryTag:該消息的index
multiple:是否批量處理.true:將一次性ack所有小于deliveryTag的消息
void basicAck(long deliveryTag, boolean multiple) throws IOException;
5. channel.basicNack()
參數:
deliveryTag:該消息的index
multiple:是否批量.true:將一次性拒絕所有小于deliveryTag的消息
requeue:被拒絕的是否重新入隊列 注意:如果設置為true ,則會添加在隊列的末端
void basicNack(long deliveryTag, boolean multiple, boolean requeue) throws IOException;
6. channel.basicConsume()
參數:
queue:隊列名稱
autoAck:是否自動ack,如果不自動ack,需要使用channel.ack、channel.nack、channel.basicReject 進行消息應答
callback:回調函數
String basicConsume(String queue, boolean autoAck, Consumer callback) throws IOException;
7. chanel.exchangeBind()
參數:
生產者發(fā)送消息到source交換器中,source根據路由鍵找到與其匹配的另一個交換器destination,并把消息轉發(fā)到destination中,存儲在destination綁定的隊列queue中
Exchange.BindOk exchangeBind(String destination, String source, String routingKey) throws IOException;
8. channel.queueDeclare()
參數:
queue: 隊列名稱
durable: 是否持久化, 隊列的聲明默認是存放到內存中的,如果rabbitmq重啟會丟失,如果想重啟之后還存在就要使隊列持久化,保存到Erlang自帶的Mnesia數據庫中,當rabbitmq重啟之后會讀取該數據庫
exclusive:是否排外的,有兩個作用,一:當連接關閉時connection.close()該隊列是否會自動刪除;二:該隊列是否是私有的private,如果不是排外的,可以使用兩個消費者都訪問同一個隊列,沒有任何問題,如果是排外的,會對當前隊列加鎖,其他通道channel是不能訪問的,如果強制訪問會報異常,一般等于true的話用于一個隊列只能有一個消費者來消費的場景
autodelete:當沒有任何消費者使用時,自動刪除該隊列
arguments:擴展參數。如:x-message-ttl
Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,Map<String, Object> arguments) throws IOException;
9. channel.queueBind()
參數:
queue 隊列名稱
exchange 交換機名稱
routingKey 路由key
AMQP.Queue.BindOk queueBind(String queue , String exchange , String routingKey ) throws IOException;
到此這篇關于RabbitMQ消息隊列中的Channel信道參數詳解的文章就介紹到這了,更多相關RabbitMQ的Channel參數信道內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot+Response如何統一返回result結果集
這篇文章主要介紹了SpringBoot+Response如何統一返回result結果集,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05SpringCloud?Gateway中GatewayFilterChain執(zhí)行流程詳解
Spring?Cloud?Gateway旨在為微服務架構提供一種簡單有效的、統一的?API?路由管理方式。Spring?Cloud?Gateway?作為?Spring?Cloud?生態(tài)系中的網關,它不僅提供統一的路由方式,并且基于?Filter?鏈的方式提供了網關基本的功能,例如:安全、監(jiān)控/埋點和限流等2022-10-10