2017-05-05 58 views
0

我是RabbitMQ的新手。 我知道,通過使用while循環,我可以查找Queue中新添加的消息。但我不想那樣。我還嘗試了EventingBasicConsumer Received事件處理程序,但只觸發用戶代碼第一次運行時出現的消息。任何新添加的消息都不會爲我觸發此代碼。如果隊列中有新消息,RibbitMQ會通知我嗎?我希望我的Web應用程序在有新消息的時候通過RabbitMQ得到通知。如何在RabbitMQ Queue中添加新消息時收到通知?

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

你見過第二個教程嗎?https://www.rabbitmq.com/tutorials/tutorial-two-java.html這很容易,你只需實現'handleDelivery'方法 – cantSleepNow

回答

0

的問題是,你關閉通道和連接調用BasicConsume後(因爲它達到你的usings範圍的結束)。您需要啓動連接和通道保持連接的長效後臺線程,然後只要有消息,您的接收處理程序就會執行。

事件使用者通常是長期居住的,並且更適合Windows服務或控制檯應用程序。然而,如果你真的需要它在一個Web應用程序中,並且你真的只需要它在後臺接收消息,那麼你可以啓動一個線程或長期任務並將其錨定在某個靜態對象中,以便它不會死。但不知道你的用例我不能說這是最好的建議。

+0

謝謝指出那個同伴。我想知道爲什麼我的事件處理程序沒有觸發,但沒有意識到它是使用塊的bcz –

相關問題