Skip to main content

Messaging through a service Bus using MassTansit with Asp.Net Core 2.2 tutorial

Today we going to look at a quick tutorial on how to use MassTransit as a messaging bus for your Asp.Net core 2.2 application. I have uploaded the sample project on GitHub, if you want to follow along

Spin up new project


To begin spin up a new Api project, I am using Visual Studio 2019, I also added 2 nuget packages listed below.

    <PackageReference Include="MassTransit.AspNetCore" Version="5.5.5" />
    <PackageReference Include="MassTransit.RabbitMQ" Version="5.5.5" />

Startup.cs 


In your Startup.cs file
public void ConfigureServices(IServiceCollection services)
        {
            //Register your message consumer
            services.AddScoped<OrderConsumer>();

            // Register MassTransit
            services.AddMassTransit(x =>
            {
                x.AddConsumer<OrderConsumer>();

                x.AddBus(provider => Bus.Factory.CreateUsingRabbitMq(cfg =>
                {
                    var host = cfg.Host(new Uri("rabbitmq://localhost"), hostConfigurator =>
                    {
                        hostConfigurator.Username("guest");
                        hostConfigurator.Password("guest");
                    });

                    cfg.ReceiveEndpoint(host, "submit-order", ep =>
                    {
                        ep.PrefetchCount = 16;
                        ep.UseMessageRetry(r => r.Interval(2, 100));

                        ep.ConfigureConsumer<OrderConsumer>(provider);
                    });
                }));
            });

            services.AddSingleton<IBus>(provider => provider.GetRequiredService<IBusControl>());
            services.AddSingleton<IHostedService, BusService>();

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        }

Notice that we registered an OrderConsumer, we then went on to add it as a consumer and specified an endpoint for it. A consumer is a piece of code which gets executed when a matching message is received. We then go on and register IBus and a class called BusService which implements IHostedService, the reason for this is that we want our Bus service to start up when the application starts up, and also exit when our application stops.

OrderConsumer.cs

Below is our OrderConsumer class, which simply implements the IConsumer interface which is part of MassTransit.

 public class OrderConsumer : IConsumer<IAddOrder>
    {
        public Task Consume(ConsumeContext<IAddOrder> context)
        {
            Console.WriteLine($"Receive message value: {context.Message.OrderDescription}");
            return Task.CompletedTask;
        }
    }

IAddOrder.cs

Before we go far before is our interface IAddOrder, at this stage is worth stopping for a breather and also to point out that you donot have to build you message against an interface, rather its the recommended why according to MassTransit, you can view their recommendation here
    public interface IAddOrder
    {
        string OrderDescription { get;}
    }

BusService.cs

Now for the BusService, as noted above this is to simply start up our BusService when our application startsup as well as terminate when our application terminates.
 public class BusService : IHostedService
    {
        private readonly IBusControl _busControl;

        public BusService(IBusControl busControl)
        {
            _busControl = busControl;
        }
        public Task StartAsync(CancellationToken cancellationToken)
        {
            return _busControl.StartAsync(cancellationToken);
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {
            return _busControl.StopAsync(cancellationToken);
        }
    }


TestController

Now for how we bring all this together in our controller.
[Route("api/[controller]")]
    [ApiController]
    public class TestController : ControllerBase
    {
        IBus _bus;
        public TestController(IBus bus)
        {
            _bus = bus;
        }
        [HttpGet]
        public async Task<IActionResult> Get()
        {
            var endpoint = await _bus.GetSendEndpoint(new Uri("rabbitmq://localhost:15672/submit-order"));
            await endpoint.Send<IAddOrder>(new  { OrderDescription="test order" });
            return Ok();
        }
    }

Comments

Popular posts from this blog

Bringing together DotNet Core, Nginx and Supervisor on a linux server

We going to look at a simple tutorial on how to have your .net core site run on a linux server and make use of supervisor to start up and monitor the site. First we going to assume you have supervisor installed on the box, with nginx already running. Configure supervisor firstly browse to the folder /etc/supervisor/conf.d Inside this folder create a .conf file for example dotnettest.conf Open the dotnettest.conf and insert the following lines [program:dotnettest] command=/usr/bin/dotnet  /home/testapp/bin/Debug/netcoreapp2.2/publish/testapp.dll directory=/home/testapp/bin/Debug/netcoreapp2.2/publish/ autostart=true autorestart=true stderr_logfile=/var/log/dotnettest.err.log stdout_logfile=/var/log/dotnettest.out.log environment=ASPNETCORE_ENVIRONMENT=Production user=root stopsignal=INT For the explanation of the above you specify the name of your site by placing "program:" in front of it command you use to specify that you want dotnet which is l...

Adding File logging into .net Core 2.0 application

Will be making use of Serilog to log for our application. To get started we need the following Nuget packages. Serilog.AspNetCore Serilog.Settings.Configuration Serilog.Sinks.Console Serilog.Sinks.RollingFile StartUp.cs using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Serilog; namespace MyBlog {     public class Startup     {         public Startup(IConfiguration configuration)         {             Log.Logger = new LoggerConfiguration().ReadFrom.Configuration(configuration).CreateLogger(); // <-- add for logging             Configuration = configuration;         }         public IConfiguration Configuration { get; }       ...