[英]RabbitMQ. Best practice for waiting for next message
我在ASP.NET Core Web应用程序中有一个接收器方法:
public void ReceiveMessage()
{
using (var connection = CreateConnection())
using (var channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "QueueName",durable: false,exclusive: false,autoDelete: false,arguments: null);
channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
//Do something
channel.BasicAck(deliveryTag: ea.DeliveryTag,multiple: false);
};
channel.BasicConsume(queue: "QueueName",autoAck: false,consumer: consumer);
//BAD!!!
while (true)
{
}
}
}
您会注意到我正在使用while(true),它闻起来很不好。 我基本上需要保持这种方法的生命,并想知道其他人是如何做到的?
此方法应始终保持活动状态,并自动按1对1的顺序处理消息
看一下OWIN软件包-在NuGet中可用:Microsoft.Owin.Hosting
使用它时,您是在自托管Web服务,并且您的应用程序将以以下调用开始:
WebApp.Start(queryServiceUrl, Startup);
其中“启动”是进行所有初始化的一种方法。 您的应用程序/服务将继续运行,并将接受对指定URL的查询。
没有循环,调用channel.BasicConsume
之后的瞬间,整个对象(连接/通道)将超出范围,并通过using
语句立即处置/销毁。 因此,没有循环,您的消费者实际上不会消耗任何东西。
为了确保使用者操作,您需要有一个无限循环,并具有适当的逻辑以在关闭程序时退出。 这是用于RabbitMQ的.NET库的不幸设计,但事实就是如此。
while (_isRunning & channel.IsOpen) {
Thread.Sleep(1);
// Other application logic here; e.g. periodically break out of the
// loop to prevent unacknowledged messages from accumulating in the system
// (if you don't, random effects will guarantee that they eventually build up)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.