Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 685
severin Avatar asked Apr 25 '17 11:04

severin


People also ask

What is RabbitMQ in asp net core?

In this article, we are going to take a look at using a message broker, RabbitMQ, with an ASP.NET Core Web API application. Message brokers are applications that allow other applications to send and receive messages in an asynchronous manner.

How do I add consumers in RabbitMQ?

Registering a Consumer (Subscribing, "Push API") Applications can subscribe to have RabbitMQ push enqueued messages (deliveries) to them. This is done by registering a consumer (subscription) on a queue. After a subscription is in place, RabbitMQ will begin delivering messages.

Is a .NET friendly abstraction over message broker technologies like RabbitMQ?

MassTransit is a . NET Friendly abstraction over message-broker technologies like RabbitMQ. It makes it easier to work with RabbitMQ by providing a lots of dev-friendly configurations. It essentially helps developers to route messages over Messaging Service Buses, with native support for RabbitMQ.


1 Answers

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.
like image 64
Ilya Chumakov Avatar answered Sep 21 '22 07:09

Ilya Chumakov