一、Exclusive概述
Exclusive queue(獨有隊列)是一個僅有一個連接(connection)的消費者能訪問的隊列。當connection關閉時, RabbitMQ會刪除這個隊列。換句話說,這種隊列適用於只要有一個連接消費就可以的場景,而不適合多個連接消費的場景。
連接指的是在客戶端與RabbitMQ伺服器之間建立的通信連接,可以看作是一個TCP連接。當從伺服器退出的時候,客戶端與伺服器的連接關閉,包括所有它們創建的隊列和交換器都會被刪除。
在某些特殊情況下,如果連接關閉,但是你不想要隊列被自動刪除,可以使用autodelete參數。這個參數默認為true,表示只要與這個queue連接的channel(通道)關閉,那麼這個queue就會自動刪除。但是,當autodelete=false的時候,只有當所有相關的channel都關閉的時候這個queue才會自動刪除。
二、Exclusive使用步驟
1.創建一個獨有的非持久化的Queue
try { //創建連接,這裡RabbitMQ伺服器地址為localhost,埠號為5672,你需要使用你自己的主機名和埠號 ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); factory.setPort(5672); Connection connection = factory.newConnection(); //創建通道 Channel channel = connection.createChannel(); //聲明隊列(Queue) String queueName = "myQueue"; boolean durable = false; boolean exclusive = true; boolean autoDelete = false; channel.queueDeclare(queueName, durable, exclusive, autoDelete, null); } catch (IOException | TimeoutException e) { e.printStackTrace(); }
2.發送消息到隊列中
try { //創建連接,這裡RabbitMQ伺服器地址為localhost,埠號為5672,你需要使用你自己的主機名和埠號 ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); factory.setPort(5672); Connection connection = factory.newConnection(); //創建通道 Channel channel = connection.createChannel(); //聲明隊列(Queue) String queueName = "myQueue"; boolean durable = false; boolean exclusive = true; boolean autoDelete = false; channel.queueDeclare(queueName, durable, exclusive, autoDelete, null); //發送消息 String message = "Hello RabbitMQ"; channel.basicPublish("", queueName, null, message.getBytes()); } catch (IOException | TimeoutException e) { e.printStackTrace(); }
3.消費隊列中的消息
try { //創建連接,這裡RabbitMQ伺服器地址為localhost,埠號為5672,你需要使用你自己的主機名和埠號 ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); factory.setPort(5672); Connection connection = factory.newConnection(); //創建通道 Channel channel = connection.createChannel(); //聲明隊列(Queue) String queueName = "myQueue"; boolean durable = false; boolean exclusive = true; boolean autoDelete = false; channel.queueDeclare(queueName, durable, exclusive, autoDelete, null); //創建消費者 Consumer consumer = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String message = new String(body, "UTF-8"); System.out.println("接收到的消息:" + message); } }; channel.basicConsume(queueName, true, consumer); } catch (IOException | TimeoutException e) { e.printStackTrace(); }
三、Exclusive相關問題解答
1.何時使用獨有隊列?
我們通常在以下情況下使用獨佔隊列:
(1)在使用多個channel去處理消息的時候,獨佔隊列可以確保消息只會被其中一個channel消費。這一點在當我們需要處理優先順序時尤其重要。
(2)在我們需要確保這個隊列在只要還有消費者在處理消息時不會被自動刪除時。
2.如果想要多個不同的連接去處理同一個隊列,怎麼辦?
獨佔隊列的使用適用於只有一個連接消費的場景。如果要多個不同的連接去處理同一個隊列,那麼我們不能使用獨佔隊列。需要使用非獨佔隊列,並且需要確保消息的時序。
3.隊列和連接的生命周期是如何管理的?
隊列和連接是由RabbitMQ伺服器管理的。每個連接如果沒有活動時間的限制,都會持續存在伺服器上。當連接關閉的時候,伺服器會自動關閉相關的隊列和Exchange。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/289268.html