2017-05-05 59 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 –

相关问题