web-dev-qa-db-fra.com

Configurer le consommateur RabbitMQ dans l'application ASP.NET Core

J'ai une application ASP.NET Core où je voudrais consommer des messages RabbitMQ.

J'ai réussi à configurer les éditeurs et les consommateurs dans les applications de ligne de commande, mais je ne sais pas comment les configurer correctement dans une application Web.

Je pensais l'initialiser dans Startup.cs, mais bien sûr, il meurt une fois le démarrage terminé.

Comment initialiser correctement le consommateur à partir d'une application web?

21
severin

Utilisez le modèle Singleton pour un consommateur/écouteur pour le conserver pendant l'exécution de l'application. Utilisez l'interface IApplicationLifetime pour démarrer/arrêter le consommateur lors du démarrage/arrêt de l'application.

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();    
    }
}
  • Vous devez prendre soin de l'emplacement d'hébergement de votre application. Par exemple, IIS peut recycler et arrêter l'exécution de votre code.
  • Ce modèle peut être étendu à un pool d'auditeurs.
26
Ilya Chumakov

Voici mon auditeur:

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();


    }
}
7
Pàldi Gergő