2011-07-06 7 views
5

Se ho effettuato una coda che è esclusiva e duratura (non elimina automaticamente). Ora, se il consumatore si iscrive a quella coda e poi scende. Quindi quella coda viene eliminata.Uso di code esclusive + permanenti, per RabbitMQ

Ho verificato lo scenario, quando la coda è solo duratura (vale a dire né esclusiva né eliminazione automatica). Ora, se il consumatore si iscrive a quella coda e poi scende. Quindi quella coda viene eliminata.

Spiegare il 1 ° caso, il 2 ° caso dà il risultato previsto. In entrambi gli scenari, solo 1 utente è iscritto a una coda e vi è una sola coda associata a una diretta_exchange.

risposta

15

Se si dispone di una coda che è esclusiva, quando il canale che ha dichiarato la coda viene chiuso, la coda viene eliminata.

Se si dispone di una coda che viene eliminata automaticamente, quindi quando non ci sono abbonamenti lasciati su quella coda verrà eliminata.

Queste due regole si applicano anche per le code resistenti.

+1

Perché dovrebbero farlo? Mi piace molto la funzione di esclusione (blocco), ma non posso permettermi di perdere i messaggi in coda quando il servizio che elabora i messaggi va giù. Posso avere un solo servizio che esegue i messaggi di elaborazione e quando si interrompe, il servizio di fail back rileva che ora può avere diritti esclusivi sulla coda e diventare proprietario. Ma se i messaggi sono andati! È piuttosto inutile per me. – code5

+2

Rispondere a questa domanda fin dai tempi antichi, poiché mi ci è voluto un po 'per trovare la risposta: ciò che in realtà desideri è un consumo esclusivo, non una coda esclusiva. – Hobblin

6

Una cosa da correggere, la coda esclusiva verrà cancellata dopo che la connessione è chiusa e il canale non è chiuso. è possibile eseguire questo test:

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

} 
Problemi correlati