目录
介绍
MassTransit是一个免费的、开源的.NET分布式应用程序框架。借助MassTransit,可以轻松创建利用基于消息的松散耦合异步通信的应用程序和服务,以实现更高的可用性、可靠性和可扩展性。
您可以查看 MassTransit文档和 GitHub存储库以获取更多信息。
安装RabbitMQ
我们将RabbitMQ与MassTransit一起使用。因此,我们要做的第一件事是安装RabbitMQ。如果您未使用Windows,请转到Windows的安装文档或相关页面上选择您的操作系统。然后,将RabbitMQ安装到您的计算机。
创建项目
为了集成MassTransit,让我们 Startup Templates - Create a Demo | AspNet Boilerplate 页面上创建一个新项目。创建项目后,按照建议的入门文档运行项目,该文档将在项目创建后显示给您。为了在本文中使用示例代码,可以用MassTransitSample作为项目名称。
创建发布者项目
为了发布消息,我们将创建一个单独的Web项目。为此,请将一个名为MassTransitSample.Web.Publisher的空Web项目添加到解决方案中。
之后,将以下包添加到创建的项目中:
<PackageReference Include="MassTransit.RabbitMQ" Version="8.0.6" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
然后,更改发布器项目中program.cs文件的内容,如下所示:
using MassTransit;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddMassTransit(mass =>
{
mass.UsingRabbitMq((context, cfg) =>
{
cfg.Host("localhost", "/", h =>
{
h.Username("guest");
h.Password("guest");
});
cfg.ConfigureEndpoints(context);
});
});
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.Run();
这将基本上将Swagger和MassTransit整合到发布者项目中。
要发布消息,请在program.cs后面紧接着app.UseHttpsRedirection();添加以下行
app.MapPost("create-order", async (IBus bus, OrderDto order) =>
{
await bus.Publish(order);
});
创建OrderDto
在我们的消息中,我们将使用 DTO 类来发送我们的消息。因此,让我们首先创建Orders文件夹,然后在MassTransitSample.Application项目中的Orders文件夹下创建Dto文件夹,然后在Orders/Dto 文件夹下创建OrderDto类,如下所示。
public class OrderDto
{
public string OrderName { get; set; }
public decimal Price { get; set; }
}
最后,在MassTransitSample.Web.Publisher项目中添加一个MassTransitSample.Application引用,以便我们可以在发布者项目中使用OrderDto。
配置MVC项目
我们设法发布了来自发布者项目的消息。因此,现在我们需要配置我们的消费者项目来接收和处理消息。在此示例中,我们将配置MassTransitSample.Web.Mvc项目,但您可以将相同的配置应用于MassTransitSample.Web.Host或您将添加到解决方案中的任何其他web项目。
将MassTransit NuGet包添加到MVC项目:
<ItemGroup>
<PackageReference Include="MassTransit.RabbitMQ" Version="8.0.10" />
</ItemGroup>
然后,创建一个consumer以使用从发布者项目发送的消息,如下所示:
using System.Threading.Tasks;
using MassTransit;
using MassTransitSample.Orders.Dto;
using Microsoft.Extensions.Logging;
namespace MassTransitSample.Web.Orders
{
public class OrderConsumer : IConsumer<OrderDto>
{
private readonly ILogger<OrderDto> _logger;
public OrderConsumer(ILogger<OrderDto> logger)
{
_logger = logger;
}
public async Task Consume(ConsumeContext<OrderDto> context)
{
_logger.LogInformation("Received order {code} with price {price}",
context.Message.OrderName,
context.Message.Price
);
await Task.CompletedTask;
}
}
}
由于ASP.NET样板使用Castle.Windsor依赖关系注入,因此我们将以不同于其默认文档中建议的方法进行配置MassTransit。
为了向我们的consumer类注入任何服务,我们需要在PostInitialize方法中进行此注册,以便在ASP.NET样板完成类注册到依赖项注入后执行它。为此,请转到MassTransitSampleWebMvcModule并覆盖PostInitialize方法并更改其内容,如下所示:
public override void PostInitialize()
{
IocManager.IocContainer.Register
(Component.For<OrderConsumer>().LifestyleTransient());
var busControl = Bus.Factory.CreateUsingRabbitMq(config =>
{
config.Host(new Uri("rabbitmq://localhost/"), host =>
{
host.Username("guest");
host.Password("guest");
});
config.ReceiveEndpoint(queueName: "repro-service", endpoint =>
{
endpoint.Handler<OrderDto>(async context =>
{
using (var consumer = IocManager.ResolveAsDisposable
<OrderConsumer>(typeof(OrderConsumer)))
{
await consumer.Object.Consume(context);
}
});
});
});
IocManager.IocContainer.Register
(Component.For<IBus, IBusControl>().Instance(busControl));
busControl.Start();
}
毕竟,运行MassTransit.Publisher应用程序和MassTransit.Web.Mvc应用程序。然后,在发布者应用上打开/swagger URL并发送消息。此消息将由MVC项目中的OrderConsumer处理。
源代码
您可以在 Github 上访问示例项目 https://github.com/aspnetboilerplate/aspnetboilerplate-samples/tree/master/MassTransitSample。
https://www.codeproject.com/Tips/5352379/Using-MassTransit-with-RabbitMQ-in-ASP-NET-Boilerp