2011-07-06 18 views
5

Si he creado una cola que es exclusiva y duradera (no se elimina automáticamente). Ahora, si el consumidor se suscribe a esa cola y luego baja. Entonces esa cola se elimina.Uso de colas exclusivas + duraderas, para RabbitMQ

He comprobado el escenario, cuando la cola solo es duradera (es decir, ni exclusiva ni automática). Ahora, si el consumidor se suscribe a esa cola y luego baja. Entonces esa cola se elimina.

Por favor explique el primer caso, el segundo caso está dando el resultado esperado. En ambos escenarios, solo 1 consumidor está suscrito a una cola, y solo hay una cola vinculada a un intercambio directo.

Respuesta

15

Si tiene una cola que es exclusiva, cuando se cierra el canal que declaró la cola, se elimina la cola.

Si tiene una cola que se elimina automáticamente, cuando no haya subscripciones en esa cola, se eliminarán.

Estas dos reglas se aplican incluso para colas duraderas.

+1

¿Por qué harían eso? Me gusta mucho la característica de exclusividad (bloqueo) pero no puedo permitir perder mensajes en la cola cuando el servicio que procesa los mensajes falla. Solo puedo tener un servicio que ejecute mensajes de procesamiento y, cuando se apaga, el servicio de recuperación detectará que ahora puede tener derechos exclusivos sobre la cola y tomar posesión. ¡Pero si los mensajes se han ido! Es bastante inútil para mí. – code5

+2

Respondiendo a esta pregunta desde la antigüedad, ya que me llevó un tiempo encontrar la respuesta: lo que realmente quieres es consumo exclusivo, cola no exclusiva. – Hobblin

6

Una cosa para corregir, la cola exclusiva se eliminará después de que la conexión esté cerrada, no el canal esté cerrado. puede ejecutar esta prueba:

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

} 
Cuestiones relacionadas