Использование эксклюзивных + надежных очередей для RabbitMQ - PullRequest
6 голосов
/ 06 июля 2011

Если я создал очередь, которая является эксклюзивной и надежной (не удаляется автоматически). Теперь, если потребитель подписывается на эту очередь, а затем она падает. Затем эта очередь удаляется.

Я проверил сценарий, когда очередь только долговечна (то есть ни исключающая, ни автоматическое удаление). Теперь, если потребитель подписывается на эту очередь, а затем она падает. Затем эта очередь удаляется.

Пожалуйста, объясните первый случай, второй случай дает ожидаемый результат. В обоих сценариях только 1 потребитель подписан на одну очередь, и только одна очередь связана с одним direct_exchange.

Ответы [ 2 ]

16 голосов
/ 06 июля 2011

Если у вас есть очередь, которая является исключительной, то когда канал, который объявил очередь, закрыт, очередь удаляется.

Если у вас есть очередь, которая автоматически удаляется, тогда, когда нетподписки, оставленные в этой очереди, будут удалены.

Эти два правила применяются даже для длительных очередей.

6 голосов
/ 27 июня 2012

Одна вещь, которую нужно исправить, исключительная очередь будет удалена после закрытия соединения , а не закрытия канала. Вы можете запустить этот тест:

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...