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

如何在RabbitMQ队列中添加新消息时获得通知?,rabbitmq,Rabbitmq,我是拉比犬的新手。 我知道通过使用while循环,我可以在队列中查找新添加的消息。但我不想走那条路。我还尝试了EventingBasicConsumer接收事件处理程序,但这只会触发订阅服务器代码第一次运行时出现的消息。任何新添加的消息都不会为我触发此代码。如果队列中有任何新消息,RibbitMQ是否会以某种方式通知我。我希望我的Web应用程序在有新消息时得到RabbitMQ的通知 Receiver : public static class RabbitMQConsumer2 {

我是拉比犬的新手。 我知道通过使用while循环,我可以在队列中查找新添加的消息。但我不想走那条路。我还尝试了EventingBasicConsumer接收事件处理程序,但这只会触发订阅服务器代码第一次运行时出现的消息。任何新添加的消息都不会为我触发此代码。如果队列中有任何新消息,RibbitMQ是否会以某种方式通知我。我希望我的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.");
            }
        }
    }

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


事件消费者通常寿命较长,更适合Windows服务或控制台应用程序。然而,如果您在web应用程序中真的需要它,并且您真的需要它坐在后台接收消息,那么您可以启动一个线程或长期任务,并将其锚定在某个静态对象中,这样它就不会死。但由于不了解您的使用情况,我不能说这是最好的建议。

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


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

您看过第二个教程吗?这很简单,您只需实现
handleDelivery
方法您看过第二个教程吗?这很简单,您只需实现
handleDelivery
方法谢谢您指出了这一点。我想知道为什么我的事件处理程序并没有触发,但并没有意识到这是使用blockThank的bcz,因为它指出了mate。我想知道为什么我的事件处理程序并没有触发,但并没有意识到它是使用块的bcz