Search code examples
c#asp.net-corerabbitmq.net-core

Setup RabbitMQ consumer in ASP.NET Core application


I have an ASP.NET Core application where I would like to consume RabbitMQ messages.

I have successfully set up the publishers and consumers in command line applications, but I'm not sure how to set it up properly in a web application.

I was thinking of initializing it in Startup.cs, but of course it dies once startup is complete.

How to initialize the consumer in a the right way from a web app?


Solution

  • Use the Singleton pattern for a consumer/listener to preserve it while the application is running. Use the IApplicationLifetime interface to start/stop the consumer on the application start/stop.

    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();    
        }
    }
    
    • You should take care of where your app is hosted. For example, IIS can recycle and stop your code from running.
    • This pattern can be extended to a pool of listeners.