RabbitMQ.Лучшая практика для ожидания следующего сообщения - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть метод приемника в веб-приложении ASP.NET Core:

    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

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Без цикла, сразу после вызова channel.BasicConsume, все это (соединение / канал) выйдет из области видимости и будет немедленно удалено / уничтожено с помощью оператора using.Таким образом, без цикла ваш потребитель фактически ничего не потребляет.

Чтобы гарантировать, что потребитель работает, вам нужен бесконечный цикл с соответствующей логикой для выхода при завершении работы программы.Это неудачный дизайн библиотеки .NET для RabbitMQ, но это то, что есть.

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)
}
0 голосов
/ 10 декабря 2018

Посмотрите на пакет OWIN, доступный в NuGet: Microsoft.Owin.Hosting

Когда вы используете его, вы самостоятельно размещаете веб-сервис, и ваше приложение запускается с вызова:

WebApp.Start(queryServiceUrl, Startup);

Где «Запуск» - это метод для всей вашей инициализации.Ваше приложение / служба работает и будет принимать запросы по указанному URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...