RabbitMQ排他性隊列Exclusive Queue詳解
RabbitMQ排他性隊列Exclusive Queue
如果你想創(chuàng)建一個只有自己可見的隊列,即不允許其它用戶訪問,RabbitMQ允許你將一個Queue聲明成為排他性的(Exclusive Queue)。
該隊列的特點是:
- 只對首次聲明它的連接(Connection)可見
- 會在其連接斷開的時候自動刪除。
對于第一點,首先是強調(diào)首次聲明,因為另外一個連接無法聲明一個同樣的排他性隊列;其次是只區(qū)別連接(Connection)而不是通道(Channel),從同一個連接創(chuàng)建的不同的通道可以同時訪問某一個排他性的隊列。
這里說的連接是指一個AMQPConnection,以RabbitMQ的Java客戶端為例:
Connection conn = factory.newConnection();
如果試圖在一個不同的連接中重新聲明或訪問(如publish,consume)該排他性隊列,會得到資源被鎖定的錯誤:
ESOURCE_LOCKED - cannot obtain exclusive access to locked queue 'UserLogin2'
對于第二點,RabbitMQ會自動刪除這個隊列,而不管這個隊列是否被聲明成持久性的(Durable =true)。
也就是說即使客戶端程序將一個排他性的隊列聲明成了Durable的,只要調(diào)用了連接的Close方法或者客戶端程序退出了,RabbitMQ都會刪除這個隊列。
注意這里是連接斷開的時候,而不是通道斷開。
這個其實前一點保持一致,只區(qū)別連接而非通道。
下面是一段示例代碼,演示了如何在同一連接的不同通道中訪問排他性隊列:
package rabbitmq.java.sample.exclusivequeue; import java.io.IOException; import com.rabbitmq.client.*; import com.rabbitmq.client.AMQP.Queue.DeclareOk; public class Producer { private final static String QUEUE_NAME = "UserLogin2"; private final static String EXCHANGE_NAME = "user.login"; /** * @param args */ public static void main(String[] args) { ConnectionFactory factory=new ConnectionFactory(); factory.setHost("CNCDS108"); try { Connection conn = factory.newConnection(); Channel channel =conn.createChannel(); DeclareOk declareOk = channel.queueDeclare(QUEUE_NAME, true, true, false, null); channel.basicPublish("", QUEUE_NAME, null, "Hello".getBytes()); //close the channel, check if the queue is deleted System.out.println("Try to close channel"); channel.close(); System.out.println("Channel closed"); System.out.println("Create a new channel"); Channel channel2 =conn.createChannel(); DeclareOk declareOk2 = channel2.queueDeclarePassive(QUEUE_NAME); //we can access the exclusive queue from another channel System.out.println(declareOk2.getQueue()); //will output "UserLogin2" channel2.basicPublish("", QUEUE_NAME, null, "Hello2".getBytes()); System.out.println("Message published through the new channel"); // System.out.println("Try to close Connection"); // conn.close(); // System.out.println("Connection closed"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
到此這篇關于RabbitMQ排他性隊列Exclusive Queue詳解的文章就介紹到這了,更多相關RabbitMQ排他性隊列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Mybatis-Plus自動填充更新操作相關字段的實現(xiàn)
數(shù)據(jù)庫表中應該都要有create_time、update_time字段;那么在開發(fā)中,對于這些共有字段的處理應該要進行統(tǒng)一,這樣就可以簡化我們的開發(fā)過程。那么本文就對Mybatis-Plus中的字段自動填充進行記錄2021-11-11java后端返回數(shù)據(jù)給前端時去除值為空或NULL的屬性、忽略某些屬性代碼示例
在Java開發(fā)中我們處理JSON數(shù)據(jù)時經(jīng)常會遇到空值(null)的情況,這篇文章主要給大家介紹了關于java后端返回數(shù)據(jù)給前端時去除值為空或NULL的屬性、忽略某些屬性的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-07-07Java實現(xiàn)讀取文件夾下(包括子目錄)所有文件的文件名
這篇文章主要介紹了Java實現(xiàn)讀取文件夾下(包括子目錄)所有文件的文件名,本文把代碼組織成了一個模塊,可以很方便的使用,需要的朋友可以參考下2015-06-06解決出現(xiàn) java.lang.ExceptionInInitializerError錯誤問題
這篇文章主要介紹了解決出現(xiàn) java.lang.ExceptionInInitializerError錯誤問題的相關資料,需要的朋友可以參考下2017-01-01