为RabbitMQ使用独占+持久队列

Gur*_*ngh 6 rabbitmq

如果我创建了一个独占且持久的队列(不是自动删除).现在,如果消费者订阅该队列,那么它就会崩溃.然后该队列被删除.

我检查了这个场景,当队列只是持久的时候(即既不是独占也不是自动删除).现在,如果消费者订阅该队列,那么它就会崩溃.然后该队列被删除.

请解释第1例,第2例给出预期结果.在这两种情况下,只有1个使用者订阅了一个队列,并且只有一个队列绑定到一个direct_exchange.

Rob*_*rop 16

如果您有一个独占队列,那么当声明队列的通道关闭时,队列将被删除.

如果您有一个自动删除的队列,那么当该队列上没有订阅时,它将被删除.

即使对于持久队列,这两个规则也适用.

  • 从古代回答这个问题,因为我花了一段时间才找到它的答案:你真正想要的是独占消费,而不是排他性排队. (3认同)

Rad*_*der 6

要纠正的一件事是,在关闭连接而不关闭通道后,将删除独占队列.你可以运行这个测试:

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

}
Run Code Online (Sandbox Code Playgroud)