2011-11-04 16 views
7

rabbitMQバインディングで動作するwcfサービスを作成しようとしています。私は正常にサーバーとクライアントを作成し、クライアントがキューを介してサーバーにメッセージを送信させることができました。私は2つの問題について混乱しています。WCFと永続的キューを持つRabbitMQ

  1. サービスがシャットダウンすると、キューは削除されます。キューが永続的になるようにwcfとrabbitMQを設定する方法はありますか?私のサーバーがクラッシュした場合、データを失う心配はありません。

  2. キューの名前を制御できないようです。 rabbitmqctl.bat list_queuesを実行すると、そのキューはamq.gen-3IgZD30XvTEQWNRsezSUUA==と呼ばれています。キューの名前を制御する方法はありますか?

答えて

9

これはWCFバインディングでは実行できません。詳細については、thisメーリングリストのスレッドを参照してください。

基本的に、あなたは順番に、あなただけ使用できることを意味し、(あなたが見ているような)匿名キューに限定されていることを意味する、WCF経由でキュー名を制御することはできません非永続キュー。

WCFバインディングによって提供されるよりも多くの制御が必要な場合は、完全な.NETクライアントの使用を検討する必要があります。それは非常に使いやすいですし、tutorials(彼らはJavaにありますが、.NET APIは非常に似ています)を開始するのに役立つ束があります。

+4

ありがとうございました。それは私が探していた答えです。それはあなたにこの制御を与えることができない場合、基本的にそれは無意味にもWCFのrabbitMQのバインディングを持っています。 –

5

私はあなたと同じ問題を抱えていました。私がしたことは、rabbitMQDotNetClientのソースコードを編集することでした。

ファイル:RabbitMQInputChannel.cs

public override void Open(TimeSpan timeout) 
    {    
     if (State != CommunicationState.Created && State != CommunicationState.Closed) 
      throw new InvalidOperationException(string.Format("Cannot open the channel from the {0} state.", base.State)); 

     OnOpening(); 
#if VERBOSE 
     DebugHelper.Start(); 
#endif 
     //Create a queue for messages destined to this service, bind it to the service URI routing key 
#if USE_DEFINED_QUEUE_NAMES 
     //here we create a queue that uses the name given in the service address in the wcf binding. 
     //if the address in the web.config is: soap.amq:///QueueName 
     //the name of the queue will be: QueueName 
     //LVV 
     string queue = m_model.QueueDeclare(base.LocalAddress.Uri.PathAndQuery, true, false, false, null); 
#else 
     string queue = m_model.QueueDeclare(); 
#endif 
     m_model.QueueBind(queue, Exchange, base.LocalAddress.Uri.PathAndQuery, null); 

     //Listen to the queue 
     m_messageQueue = new QueueingBasicConsumer(m_model); 
     m_model.BasicConsume(queue, false, m_messageQueue); 

#if VERBOSE 
     DebugHelper.Stop(" ## In.Channel.Open {{\n\tAddress={1}, \n\tTime={0}ms}}.", LocalAddress.Uri.PathAndQuery); 
#endif 
     OnOpened(); 
    } 

コンパイルフラグUSE_DEFINED_QUEUE_NAMESと。これにより、app.configファイルまたはweb.configファイルに指定した名前のキュー名が作成されます。キューが私が作成しているものとは異なる振る舞いをするようにするには、QueueDeclare(...)のキューオプションをいつでも変更することができます。 乾杯!

関連する問題