2017-07-03 5 views
2

背景INFORabbitMQのEventBasicConsumer

働いていない私は、RabbitMQの中(電子メール用)のキューを持って、そしてそれのために消費者を構築したいです。このキューは、顧客に電子メールを送信するために別の.NETアプリケーションによって使用されます。電子メールロジックを.NETアプリケーションの外に置いて、耐久性... RabbitMQが提供するメリットがあることを望みました。

ISSUE

.NETアプリがキューにプッシュ型電子メール/公開することができますが、私は難しさ、消費者の構築を持っています!ここでは、消費者のための私のコードです:

// A console app that would be turned into a service via TopShelf 
public void Start() 
{ 
    using (_connection = _connectionFactory.CreateConnection()) 
    { 
    using (var model = _connection.CreateModel()) 
    { 
     model.QueueDeclare(_queueName, true, false, false, null); 
     model.BasicQos(0, 1, false); 

     var consumer = new EventingBasicConsumer(model); 
     consumer.Received += (channelModel, ea) => 
     { 
     var message = (Email) ea.Body.DeSerialize(typeof(Email)); 
     Console.WriteLine("----- Email Processed {0} : {1}", message.To, message.Subject); 
     model.BasicAck(ea.DeliveryTag, false); 
     }; 
     var consumerTag = model.BasicConsume(_queueName, false, consumer); 
    } 
    } 
} 

上記のコードは、キューからメッセージを取得し、(このofficial guideに応じて)それらを処理することができるはずですが、これは起きていません。

+0

多くのことが間違っている可能性があります。どのようにメッセージを(どの交換先に)公開しますか?また、あなたの現在のコードでは、コンシューマを作成した直後( 'BasicConsume'の後)に接続が閉じられ、とにかくメッセージを受け取ることができなくなります。消費を開始した直後に接続を処理しないでください。 – Evk

+0

@ Evkパブリッシャーとコンシューマーの両方が、同じ交換とキューをターゲットにしています。しかし、私はあなたが接続の処分について正しいと思う、私はそれを修正し、それが何かをするかどうかを確認します。 – Ciwan

+0

@Evkあなたは正しいです、接続の処分が問題でした、返信してくださいと私は答えとしてマークします:) – Ciwan

答えて

1

問題は時期尚早の接続処理です。人々はしばしばBasicConsumeがブロッキングコールだと思っていますが、そうではありません。それはほとんど直ちに戻り、次の声明はチャンネルと接続の廃止(閉鎖)であり、もちろんあなたのサブスクリプションをキャンセルします。したがって、接続とモデルをプライベートフィールドに格納して、キュー消費が完了したときにだけ破棄してください。

+0

ありがとうございました。 – Ciwan

0

あなたはキューが別の.Netアプリケーションで使用されていると言っていますが、別の消費者ですか?それが別の消費者であれば、どの交換機を使用しているか確認してください。複数の消費者がメッセージを受け取るようにするには、「FanOut」エクスチェンジで先に進んでください。

+0

それは@エヴァークが提案したものであることが判明しました。 – Ciwan