2017-05-03 4 views
1

現在、我々としてのRabbitMQへのメッセージを公開する方法を作成しました:キューが冪等がそのように再作成されませんされているがRabbitMq:キューにデータを正しくプッシュする方法。毎回または一度だけキューを作成する必要がありますか?

bool PublishToQueue(string QueueName, NameValueCollection nvc) 
{  
     ConnectionFactory connectionFactory = null; 
     IConnection connection = connectionFactory.CreateConnection(hostName); 
     IModel model = connection.CreateModel(); 
     model.ExchangeDeclare(ExchangeName, ExchangeType.Direct); 
     model.QueueBind(queueName, ExchangeName, queueName + "Key", null); 
     model.ConfirmSelect(); 
     BinaryFormatter bf = new BinaryFormatter(); 
     bf.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple; 
     MemoryStream ms = new MemoryStream(); 
     bf.Serialize(ms, nvc); 
     SendMessage(model, ms.ToArray(), "RabbitMQ-" + QueueName + "-Exchange", "RabbitMq-" + QueueName + "-QueueKey", nvc["id"], nvc["category"]); 
} 

。しかし、私はそのメッセージ、接続、モデル、交換とそのバインディングを何度も何度でも初期化するのは正しいとは思わない。

誰かがキューの初期化とメッセージの送信を分ける最善の方法を教えてもらえますか?

注:これは簡略化されたコードです。フォールバックコード、ExchangeNameのような変数初期化などは含まれていません。

+0

私は質問を理解していません。公開側がキューを気にするべきではないので、あなたの例は実践のためのものです。あなたの事例を聞いていますか?あるいは、常に動いている消費者や何か他の人たちのために? – cantSleepNow

+0

これは現在使用しているパブリッシャーコードです。モデルを作成しているときに私に悪いコードを見せて、毎回キューするのは意味をなさない。キューは一度作成する必要があります。 私は最初にモデルを作成する良いプロデューサのコードをチェックしたい、メッセージを送信する機能を与える。また、コスプレマターにとっても同じことです。 exampleがパフォーマンス指向のコードを持っていれば素晴らしいだろう。それがカバーするならば、デッドレター/エラーが再試行され、それはボーナスを追加します。 – maverick

+0

あなたはこの問題を抱えていません - 毎回キューを作成しているという問題ではなく、問題は発行側で問題を発生させることです。あなたはチュートリアルを見ましたか? https://www.rabbitmq.com/tutorials/tutorial-two-dotnet.html – cantSleepNow

答えて

0

私は、交換、キュー、およびバインディングの作成を担当する単一のクラスを使用します。すでに宣言されているExchangeとキューの名前を格納するための静的な辞書があります。宣言を行う前に、これらの静的な辞書を(スレッドセーフな方法で)チェックして、それがすでに宣言されているかどうかを確認します。したがって、アプリケーションの存続期間中に宣言を1回だけ行います。

+0

サンプルコードを共有できますか? – maverick

関連する問題