When working with MassTransit, registering consumers can become cumbersome if you have many of them. Luckily, MassTransit provides a way to register all your consumers automatically using AddConsumers
. This post will guide you through the process of setting up and using AddConsumers
to simplify your consumer registration.
What is MassTransit?
MassTransit is an open-source distributed application framework for .NET, which simplifies the creation and management of message-based systems. It supports various messaging platforms like RabbitMQ, Azure Service Bus, and Amazon SQS.
Setting Up MassTransit
Before diving into consumer registration, let’s quickly set up a MassTransit project.
Step 1: Install MassTransit Packages
First, install the necessary MassTransit packages via NuGet. You can use the following command on your favorite command line:
dotnet add package MassTransit.RabbitMQ
Step 2: Configure MassTransit
In your Program.cs
or wherever you configure your services, set up MassTransit:
public class Program | |
{ | |
public static void Main(string[] args) | |
{ | |
CreateHostBuilder(args).Build().Run(); | |
} | |
public static IHostBuilder CreateHostBuilder(string[] args) => | |
Host.CreateDefaultBuilder(args) | |
.ConfigureServices((hostContext, services) => | |
{ | |
services.AddMassTransit(x => | |
{ | |
x.UsingRabbitMq((context,cfg) => | |
{ | |
cfg.ConfigureEndpoints(context); | |
}); | |
}); | |
}); | |
} |
Registering Consumers Automatically
Manually registering each consumer can be tedious, especially in a large application. MassTransit provides the AddConsumers
method, which scans and registers all consumers in your assembly.
Step 1: Create Your Consumers
First, let’s create a few consumers:
public class OrderSubmittedConsumer : IConsumer<OrderSubmitted> | |
{ | |
public Task Consume(ConsumeContext<OrderSubmitted> context) | |
{ | |
// Handle the message | |
return Task.CompletedTask; | |
} | |
} | |
public class PaymentProcessedConsumer : IConsumer<PaymentProcessed> | |
{ | |
public Task Consume(ConsumeContext<PaymentProcessed> context) | |
{ | |
// Handle the message | |
return Task.CompletedTask; | |
} | |
} |
When registering consumers automatically, I recommend to add a consumer definition for each consumer. This allows us to specify the configuration applicable for every consumer:
public class OrderSubmittedConsumerDefinition : | |
ConsumerDefinition<OrderSubmittedConsumer> | |
{ | |
public OrderSubmittedConsumerDefinition() | |
{ | |
EndpointName = "submitted-orders"; | |
ConcurrentMessageLimit = 4; | |
} | |
protected override void ConfigureConsumer(IReceiveEndpointConfigurator endpointConfigurator, | |
IConsumerConfigurator<OrderSubmittedConsumer> consumerConfigurator) | |
{ | |
endpointConfigurator.UseMessageRetry(r => r.Interval(5, 1000)); | |
endpointConfigurator.UseInMemoryOutbox(); | |
} | |
} | |
public class PaymentProcessedConsumerDefinition : | |
ConsumerDefinition<PaymentProcessedConsumer> | |
{ | |
public PaymentProcessedConsumerDefinition() | |
{ | |
EndpointName = "processed-payments"; | |
ConcurrentMessageLimit = 4; | |
} | |
protected override void ConfigureConsumer(IReceiveEndpointConfigurator endpointConfigurator, | |
IConsumerConfigurator<PaymentProcessedConsumer> consumerConfigurator) | |
{ | |
endpointConfigurator.UseMessageRetry(r => r.Interval(5, 1000)); | |
endpointConfigurator.UseInMemoryOutbox(); | |
} | |
} |
Step 2: Register Consumers Automatically
Modify your MassTransit configuration to use AddConsumers
:
public class Program | |
{ | |
public static void Main(string[] args) | |
{ | |
CreateHostBuilder(args).Build().Run(); | |
} | |
public static IHostBuilder CreateHostBuilder(string[] args) => | |
Host.CreateDefaultBuilder(args) | |
.ConfigureServices((hostContext, services) => | |
{ | |
services.AddMassTransit(x => | |
{ | |
// Automatically registers all consumers and consumerdefinitions in the current assembly | |
x.AddConsumers(typeof(Program).Assembly); | |
x.UsingRabbitMq((context,cfg) => | |
{ | |
cfg.ConfigureEndpoints(context); | |
}); | |
}); | |
}); | |
} |
AddConsumers
will scan the specified assembly (in this case, the assembly containing the Program
class) and registers all implementations of IConsumer
it finds. It will also search for related ConsumerDefinition<T>
implementations and load them as well.
By using this method MassTransit will automatically detect and configure the consumers, significantly reducing the boilerplate code required for consumer registration.