2011-07-06 19 views
5

排他的で耐久性のある(自動削除ではない)キューを作成した場合。今、消費者がそのキューにサブスクライブして、それがダウンした場合。そのキューは削除されます。RabbitMQ専用の+耐久性キューを使用する

キューが唯一の永続性(つまり、排他的でも自動削除でもない)である場合、私はシナリオをチェックしました。今、消費者がそのキューにサブスクライブして、それがダウンした場合。そのキューは削除されます。

第1のケースを説明してください。第2のケースは予期した結果を示しています。どちらのシナリオにおいても、1つのコンシューマが1つのキューにサブスクライブされ、1つのdirect_exchangeにバインドされたキューは1つだけです。

答えて

15

排他的なキューがある場合、キューを宣言したチャネルが閉じられると、そのキューは削除されます。

自動削除されたキューがある場合、そのキューにサブスクリプションが残っていなければ、そのキューは削除されます。

これらの2つのルールは、耐久性のあるキューにも適用されます。

+1

なぜそうしますか?私は排他機能(ロック)が本当に好きですが、メッセージを処理しているサービスがダウンすると、キュー内のメッセージを緩和できません。私は1つのサービスしか処理しているメッセージを処理することができません、そして、それがダウンすると、フェイルバックサービスは今それが排他的な権利をキューに持ち、所有権を取ることができることを検出します。しかし、メッセージがなくなったら!むしろ私には役に立たない。 – code5

+2

古きからこの質問に答えるには、答えを見つけるまでにしばらく時間がかかりました。あなたが実際に望むのは排他的なキューではなく排他的な消費です。 – Hobblin

6

修正するべきことの1つは、の接続が終了した後に接続の後で削除されます。このテストを実行することができます:

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

} 
関連する問題