如何在RabbitMQ队列中添加新消息时收到通知?

时间:2017-05-05 09:33:11

标签: rabbitmq

我是RabbitMQ的新手。 我知道通过使用while循环,我可以在队列中查找新添加的消息。但我不想那样做。我还尝试了EventingBasicConsumer Received事件处理程序,但只触发了第一次运行用户代码时出现的消息。任何新添加的消息都不会为我触发此代码。如果队列有任何新消息,RibbitMQ是否会通知我。我希望RabbitMQ在收到新消息时通知我的Web应用程序。

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.");
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

问题是你在调用BasicConsume之后立即关闭了频道和连接(因为它到达你的使用范围的末尾)。您需要启动一个长期存在的后台线程,其中连接和通道保持活动状态,然后您的接收处理程序将在有消息时立即执行。

事件消费者通常很长寿,更适合Windows服务或控制台应用程序。但是,如果你真的需要它在一个Web应用程序中,你真的需要它在后台接收消息,那么你可以启动一个线程或长期任务并将其锚定在一些静态对象中,这样它就不会。死了。但不知道你的用例我不能说这是最好的建议。