2017-05-05 12 views
0

私はRabbitMQを初めて使用しています。 私は、whileループを使って、キューに新しく追加されたメッセージを探すことができることを知っています。しかし、私はそのように行きたくありません。 EventingBasicConsumer Receivedイベントハンドラも試しましたが、サブスクライバコードが初めて実行されているときに存在するメッセージに対してのみトリガされます。新しく追加されたメッセージは、私のためにこのコードを引き起こすものではありません。キューに新しいメッセージがある場合、RibbitMQが私に通知する方法はありますか?新しいメッセージがあるたびにRabbitMQからWebアプリケーションに通知するようにします。RabbitMQキューに新しいメッセージが追加されたときに通知を受け取る方法は?

Receiver : 
public static class RabbitMQConsumer2 
    { 
     public static void Receive() 
     { 
      var factory = new ConnectionFactory() { HostName = "localhost" }; 
      using (var connection = factory.CreateConnection()) 
      using (var channel = connection.CreateModel()) 
      { 
       channel.ExchangeDeclare(exchange: "logs", type: "fanout"); 

       channel.QueueDeclare("AAA", true, false, false, null); 
       channel.QueueBind(queue: "AAA", 
            exchange: "logs", 
            routingKey: ""); 

       Debug.WriteLine(" [*] Waiting for logs."); 

       var consumer = new EventingBasicConsumer(channel); 
       consumer.Received += (model, ea) => 
       { 
        var body = ea.Body; 
        var message = Encoding.UTF8.GetString(body); 
        Debug.WriteLine(" [x] {0}", message); 
       }; 
       channel.BasicConsume(queue: "AAA", 
            noAck: true, 
            consumer: consumer); 

       Debug.WriteLine(" Press [enter] to exit."); 
      } 
     } 
    } 
+0

2番目のチュートリアルは見たことがありますか?https://www.rabbitmq.com/tutorials/tutorial-two-java.htmlかなり簡単です。単にhandleDeliveryメソッドを実装してください。 – cantSleepNow

答えて

0

問題があるのは、BasicConsumeを呼び出した直後(使用しているスコープの終わりに達しているため)です。接続とチャンネルが生き続ける長生きのバックグラウンドスレッドを開始する必要があります。その後、メッセージがあるとすぐに受信ハンドラが実行されます。

通常、消費者は長く存続し、Windowsサービスまたはコンソールアプリケーションに適しています。しかし、あなたが本当にWebアプリケーションでそれを必要としていて、メッセージを受け取るバックグラウンドに座っている必要がある場合は、スレッドや長寿命のタスクを開始し、静的オブジェクトにアンカーして死ぬことはありません。しかし、あなたのユースケースを知らないと、これは最高のアドバイスだとは言えません。

+0

これを指摘してくれてありがとうございます。なぜ私のイベントハンドラがトリガしていないのだろうと思っていましたが、それは使用しているブロックのbczでした –

関連する問題