我是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.");
}
}
}
答案 0 :(得分:0)
问题是你在调用BasicConsume之后立即关闭了频道和连接(因为它到达你的使用范围的末尾)。您需要启动一个长期存在的后台线程,其中连接和通道保持活动状态,然后您的接收处理程序将在有消息时立即执行。
事件消费者通常很长寿,更适合Windows服务或控制台应用程序。但是,如果你真的需要它在一个Web应用程序中,你真的需要它在后台接收消息,那么你可以启动一个线程或长期任务并将其锚定在一些静态对象中,这样它就不会。死了。但不知道你的用例我不能说这是最好的建议。