欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

RabbitMQ排他性隊(duì)列Exclusive Queue詳解

 更新時(shí)間:2023年08月29日 11:10:24   作者:排骨蝦  
這篇文章主要介紹了RabbitMQ排他性隊(duì)列Exclusive Queue詳解,如果你想創(chuàng)建一個(gè)只有自己可見(jiàn)的隊(duì)列,即不允許其它用戶(hù)訪問(wèn),RabbitMQ允許你將一個(gè)Queue聲明成為排他性的Exclusive Queue,需要的朋友可以參考下

RabbitMQ排他性隊(duì)列Exclusive Queue

如果你想創(chuàng)建一個(gè)只有自己可見(jiàn)的隊(duì)列,即不允許其它用戶(hù)訪問(wèn),RabbitMQ允許你將一個(gè)Queue聲明成為排他性的(Exclusive Queue)。

 

該隊(duì)列的特點(diǎn)是:

  • 只對(duì)首次聲明它的連接(Connection)可見(jiàn)
  • 會(huì)在其連接斷開(kāi)的時(shí)候自動(dòng)刪除。

對(duì)于第一點(diǎn),首先是強(qiáng)調(diào)首次聲明,因?yàn)榱硗庖粋€(gè)連接無(wú)法聲明一個(gè)同樣的排他性隊(duì)列;其次是只區(qū)別連接(Connection)而不是通道(Channel),從同一個(gè)連接創(chuàng)建的不同的通道可以同時(shí)訪問(wèn)某一個(gè)排他性的隊(duì)列。

這里說(shuō)的連接是指一個(gè)AMQPConnection,以RabbitMQ的Java客戶(hù)端為例:

Connection conn = factory.newConnection();    

如果試圖在一個(gè)不同的連接中重新聲明或訪問(wèn)(如publish,consume)該排他性隊(duì)列,會(huì)得到資源被鎖定的錯(cuò)誤:

ESOURCE_LOCKED - cannot obtain exclusive access to locked queue 'UserLogin2'

 對(duì)于第二點(diǎn),RabbitMQ會(huì)自動(dòng)刪除這個(gè)隊(duì)列,而不管這個(gè)隊(duì)列是否被聲明成持久性的(Durable =true)。

也就是說(shuō)即使客戶(hù)端程序?qū)⒁粋€(gè)排他性的隊(duì)列聲明成了Durable的,只要調(diào)用了連接的Close方法或者客戶(hù)端程序退出了,RabbitMQ都會(huì)刪除這個(gè)隊(duì)列。

注意這里是連接斷開(kāi)的時(shí)候,而不是通道斷開(kāi)。

這個(gè)其實(shí)前一點(diǎn)保持一致,只區(qū)別連接而非通道。

下面是一段示例代碼,演示了如何在同一連接的不同通道中訪問(wèn)排他性隊(duì)列:

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();
        }
    }
}

到此這篇關(guān)于RabbitMQ排他性隊(duì)列Exclusive Queue詳解的文章就介紹到這了,更多相關(guān)RabbitMQ排他性隊(duì)列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論