Настройка пользователя RabbitMQ в приложении ASP.NET Core

У меня есть приложение ASP.NET Core, где я бы хотел использовать сообщения RabbitMQ.

Я успешно создал издателей и потребителей в приложениях с командной строкой, но я не уверен, как правильно настроить его в веб-приложении.

Я думал инициализировать его в Startup.cs, но, конечно, он умирает после завершения запуска.

Как правильно инициализировать пользователя из веб-приложения?

Ответ 1

Используйте шаблон Singleton для потребителя/слушателя, чтобы сохранить его во время работы приложения. Используйте интерфейс IApplicationLifetime для запуска/остановки потребителя при запуске/остановке приложения.

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<RabbitListener>();
    }


    public void Configure(IApplicationBuilder app)
    {
        app.UseRabbitListener();
    }
}

public static class ApplicationBuilderExtentions
{
    //the simplest way to store a single long-living object, just for example.
    private static RabbitListener _listener { get; set; }

    public static IApplicationBuilder UseRabbitListener(this IApplicationBuilder app)
    {
        _listener = app.ApplicationServices.GetService<RabbitListener>();

        var lifetime = app.ApplicationServices.GetService<IApplicationLifetime>();

        lifetime.ApplicationStarted.Register(OnStarted);

        //press Ctrl+C to reproduce if your app runs in Kestrel as a console app
        lifetime.ApplicationStopping.Register(OnStopping);

        return app;
    }

    private static void OnStarted()
    {
        _listener.Register();
    }

    private static void OnStopping()
    {
        _listener.Deregister();    
    }
}
  • Вы должны позаботиться о том, где размещено ваше приложение. Например, IIS может перезапустить и остановить запуск кода.
  • Этот шаблон может быть распространен на пул слушателей.

Ответ 2

Это мой слушатель:

public class RabbitListener
{
    ConnectionFactory factory { get; set; }
    IConnection connection { get; set; }
    IModel channel { get; set; }

    public void Register()
    {
        channel.QueueDeclare(queue: "hello", durable: false, exclusive: false, autoDelete: false, arguments: null);

        var consumer = new EventingBasicConsumer(channel);
        consumer.Received += (model, ea) =>
        {
            var body = ea.Body;
            var message = Encoding.UTF8.GetString(body);
            int m = 0;
        };
        channel.BasicConsume(queue: "hello", autoAck: true, consumer: consumer);
    }

    public void Deregister()
    {
        this.connection.Close();
    }

    public RabbitListener()
    {
        this.factory = new ConnectionFactory() { HostName = "localhost" };
        this.connection = factory.CreateConnection();
        this.channel = connection.CreateModel();


    }
}