繁体   English   中英

RabbitMQ。 等待下一条消息的最佳做法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM