如果我创建了一个独占且持久的队列(不是自动删除)。现在,如果消费者订阅该队列,那么它就会崩溃。然后该队列被删除。
我检查了这个场景,当队列只是持久的时候(即既不是独占也不是自动删除)。现在,如果消费者订阅该队列,那么它就会崩溃。然后该队列被删除。
请解释第一种情况,第二种情况给出预期结果。在这两种情况下,只有1个使用者订阅了一个队列,并且只有一个队列绑定到一个direct_exchange。
答案 0 :(得分:16)
如果您的队列是独占的,那么当声明队列的通道关闭时,队列将被删除。
如果您有一个自动删除的队列,那么当该队列上没有订阅时,它将被删除。
这两条规则适用于持久队列。
答案 1 :(得分: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();
}
}
}