C#中masstranist快速入门

在 MassTransit 中,Command(命令)Event(事件) 的核心区别在于意图(Intention)传递方式(Delivery)。简单来说:

  • Command(命令) :是告诉一个服务去做什么 。它使用 Send 发送到特定 的端点,期望只有一个消费者处理它。

  • Event(事件) :是宣告某件事情已经发生 。它使用 Publish 进行广播,所有订阅了该事件的服务都会收到一份副本

维度 Command (命令) Event (事件)
核心意图 指示、请求执行一个动作 通知、宣告一个已发生的事实
目标消费者 单一 消费者,由一个服务实例处理 零到多个消费者,所有订阅者都会收到
传递方式 使用 Send 发送到已知的特定队列/端点 使用 Publish 进行广播/发布-订阅
命名规范 动词-名词 ,如 SubmitOrder 名词-动词(过去时) ,如 OrderSubmitted
紧耦合/松耦合 发送方知道接收方的确切地址,耦合度更高 发送方无需知道接收方,实现松耦合

然后定义一个web程序

引用的nuget包

XML 复制代码
  <ItemGroup>
    <PackageReference Include="MassTransit.RabbitMQ" Version="8.5.10" />
    <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.1" />
    <PackageReference Include="Swashbuckle.AspNetCore" Version="7.3.2" />
  </ItemGroup>
cs 复制代码
using MassTransit;
using WebApplication_MT.Customers;
using WebApplication_MT.Endpoints;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

// 添加 Swagger 服务
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();


builder.Services.AddMassTransit(t =>
{
    t.AddConsumer<OrderCreatedWebConsumer>();
    t.AddConsumer<TestCommandWebConsumer>();

    //使用内存传输(适合开发和测试环境)
    //t.UsingInMemory((context, cfg) =>
    //{
    //    // 强烈建议加上这行,让 MassTransit 自动配置队列和消费者绑定
    //    cfg.ConfigureEndpoints(context); 
    //});

    //使用 RabbitMQ 传输/可以跨程序传输消息(适合生产环境)
    t.UsingRabbitMq((contex, cfg) =>
    {
        cfg.Host("localhost", "/", h =>
        {
            h.Username("guest");
            h.Password("guest");
        });
        cfg.ConfigureEndpoints(contex);
    });
});


//配置日志
builder.Services.AddLogging(ser =>
{
    ser.AddConsole();
    ser.SetMinimumLevel(LogLevel.Debug);
});

var app = builder.Build();

// Configure the HTTP request pipeline.

// 配置 Swagger 中间件
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

//app.MapWeatherEndpoint();
app.MapMTEndpoint();

app.Run();

api定义

cs 复制代码
using ClassLibrary_MT.MessageCommands;
using ClassLibrary_MT.MessageContracts;
using ClassLibrary_MT.MessageEvents;
using MassTransit;
using Microsoft.AspNetCore.Mvc;
using WebApplication_MT.Customers;


namespace WebApplication_MT.Endpoints;

public static class MTEndpoint
{
    public static void MapMTEndpoint(this IEndpointRouteBuilder app)
    {

        app.MapPost("/massTransit/event", async ([FromBody] OrderCreateEvent info, IPublishEndpoint publish, ILogger<OrderCreateEvent> logger) =>
        {
            logger.LogInformation($"api收到请求(Event):{info}");
            await publish.Publish(info);
        });

        app.MapPost("/massTransit/command/self", async ([FromBody] TestCommand info, ISendEndpointProvider sendEndpointProvider, ILogger<OrderCreateEvent> logger) =>
        {
            logger.LogInformation($"api收到请求(Command):{info}");

            // 发送到特定队列
            var endpoint = await sendEndpointProvider.GetSendEndpoint(
                new Uri($"queue:TestCommandWeb"));

            await endpoint.Send(info);
        });

        app.MapPost("/massTransit/command/other", async ([FromBody] TestCommand info, ISendEndpointProvider sendEndpointProvider, ILogger<OrderCreateEvent> logger) =>
        {
            logger.LogInformation($"api收到请求(Command):{info}");

            // 发送到特定队列
            var endpoint = await sendEndpointProvider.GetSendEndpoint(
                new Uri($"queue:TestCommand"));

            await endpoint.Send(info);
        });

        app.MapPost("/massTransit/request", async ([FromBody] OrderRequest request, IRequestClient<OrderRequest> client, ILogger<OrderCreateEvent> logger) =>
        {
            logger.LogInformation($"api收到(request):{request}");
            // 关键:发送请求并等待响应(超时时间5秒)
            var response = await client.GetResponse<OrderResponse>(request, timeout: RequestTimeout.After(s: 5));

            var result = response.Message;

            logger.LogInformation($"api收到(response):{result}");

            return Results.Ok(result);
        });
    }
}

定义一些 Consumer

cs 复制代码
using ClassLibrary_MT.MessageCommands;
using ClassLibrary_MT.MessageEvents;
using MassTransit;

namespace WebApplication_MT.Customers;

public class OrderCreatedWebConsumer : IConsumer<OrderCreateEvent>
{

    private readonly ILogger<OrderCreatedWebConsumer> _logger;

    public OrderCreatedWebConsumer(ILogger<OrderCreatedWebConsumer> logger)
    {
        _logger = logger;
    }

    public Task Consume(ConsumeContext<OrderCreateEvent> context)
    {
        _logger.LogInformation($"web收到订单事件: {context.Message}");
        return Task.CompletedTask;
    }

    
}
cs 复制代码
using ClassLibrary_MT.MessageCommands;
using MassTransit;

namespace WebApplication_MT.Customers
{
    public class TestCommandWebConsumer : IConsumer<TestCommand>
    {
        private readonly ILogger<TestCommandWebConsumer> _logger;

        public TestCommandWebConsumer(ILogger<TestCommandWebConsumer> logger)
        {
            _logger = logger;
        }

        public Task Consume(ConsumeContext<TestCommand> context)
        {
            _logger.LogInformation($"web收到订单命令: {context.Message}");
            return Task.CompletedTask;
        }
    }
}

然后运行在swaager 页面触发,能到Consumer

相关推荐
lv__pf16 小时前
09-深入理解AQS之独占锁ReentrantLock源码分析【TL 并发 09】
java·开发语言
...62216 小时前
WinForm中Socket通信服务端客户端代码实现讲解
tcp/ip·c#·socket
这是程序猿16 小时前
Java线程池深度剖析:源码原理、核心参数、任务调度与生产调优实战
java·开发语言·python
quantdash_cc16 小时前
从数据采集到策略消费,股票日内行情管道应该怎么设计?
开发语言·python·数据分析·量化交易·股票数据·quantdash
郝学胜-神的一滴16 小时前
C++20模板元编程 01:从零吃透模板核心底层逻辑
开发语言·c++·vscode·程序人生·开源
可乐鸡翅yeah_17 小时前
HLS流媒体首屏起播慢深度优化,从分片、索引、播放器全链路调优
开发语言·javascript·ecmascript·m3u8·m3u8在线
luj_176817 小时前
生物体如何应对功能击穿?
c语言·开发语言·c++·经验分享·算法
luj_176817 小时前
击穿分析五大关键步骤
开发语言·网络·c++·经验分享·算法
wuyk55517 小时前
从零吃透 MQTT 通信|第 11 章 MQTT 项目调试验证、性能优化、常见疑难问题、OTA 升级基础
c语言·开发语言·stm32·学习·性能优化
海盗123417 小时前
微软技术日报 2026-09-14:Rust 升为微软一级语言,云业务重组为智能体与基础设施
开发语言·microsoft·rust