You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用MassTransit消费消息遇MassTransit.PayloadNotFoundException报错求助

MassTransit消费消息时出现PayloadNotFoundException(MessageSchedulerContext未找到)

我在使用MassTransit消费消息时,RabbitMQ管理界面中出现如下错误:

MT-Fault-ExceptionType: MassTransit.PayloadNotFoundException
MT-Fault-Message:   The payload was not found: MassTransit.MessageSchedulerContext
MT-Fault-StackTrace:    at MassTransit.PipeExtensions.GetPayload[TPayload](PipeContext context) in /_/src/MassTransit.Abstractions/Middleware/PipeExtensions.cs:line 55
at MassTransit.Context.ScheduleMessageRedeliveryContext`1.ScheduleRedelivery(TimeSpan delay, Action`2 callback) in /_/src/MassTransit/Contexts/Context/ScheduleMessageRedeliveryContext.cs:line 28
at MassTransit.Middleware.RedeliveryRetryFilter`2.Send(TContext context, IPipe`1 next) in /_/src/MassTransit/Middleware/RedeliveryRetryFilter.cs:line 101

我的配置代码如下:

private static void AddMessagingConfiguration(IServiceCollection services, WebApplicationBuilder builder)
{
    services.AddMassTransit(busConfigurator =>
    {
        busConfigurator.AddConsumer<GtsDocumentConsumer>();
        busConfigurator.AddEntityFrameworkOutbox<CompanyGoodsDbContext>(outboxConfigurator =>
        {
            outboxConfigurator.UseSqlServer();
            outboxConfigurator.UseBusOutbox();
            outboxConfigurator.QueryMessageLimit = 10;
            outboxConfigurator.QueryDelay = TimeSpan.FromSeconds(1);
            outboxConfigurator.QueryTimeout = TimeSpan.FromSeconds(30);
        });

        busConfigurator.AddOptions<MassTransitHostOptions>()
            .Configure(options =>
            {
                options.WaitUntilStarted = true;
                //options.StartTimeout = TimeSpan.FromSeconds(1);
                //options.StopTimeout = TimeSpan.FromSeconds(30);
            });
        

        busConfigurator.UsingRabbitMq((busContext, transportConfigurator) =>
        {
            transportConfigurator.Host(builder.Configuration["EventBusSettings:HostAddress"], "/", hostConfiguration =>
            {
                hostConfiguration.Username(builder.Configuration["EventBusSettings:Username"]);
                hostConfiguration.Password(builder.Configuration["EventBusSettings:Password"]);
            });

            transportConfigurator.AutoStart = true;
            transportConfigurator.UseMessageRetry(r => r.Immediate(5));
            transportConfigurator.UseScheduledRedelivery(r =>
                r.Intervals(TimeSpan.FromSeconds(5), TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(30)));
            transportConfigurator.ConfigureEndpoints(busContext);
        });
    });
}

该配置在本地Docker环境中两个应用间测试正常,但部署到服务器后出现上述错误,请求协助解决。


解决方案

这个错误的核心原因是启用了ScheduledRedelivery但未配置消息调度器,导致MassTransit无法找到MessageSchedulerContext来处理延迟重发逻辑。

修复步骤:

  1. 为RabbitMQ配置消息调度器
    在UsingRabbitMq配置块中添加消息调度器的初始化代码,确保在UseScheduledRedelivery之前配置:
busConfigurator.UsingRabbitMq((busContext, transportConfigurator) =>
{
    // 原Host配置代码...

    // 新增:启用消息调度器,指定延迟消息存储的交换器地址
    transportConfigurator.UseMessageScheduler(new Uri($"rabbitmq://{builder.Configuration["EventBusSettings:HostAddress"]}/scheduled-messages"));

    // 原AutoStart、Retry、Redelivery等配置...
});
  1. 确认服务器RabbitMQ已启用延迟消息插件
    ScheduledRedelivery依赖RabbitMQ的rabbitmq_delayed_message_exchange插件,本地Docker镜像可能预装,但服务器环境需手动启用:
  • 进入RabbitMQ容器:docker exec -it <rabbitmq-container-name> bash
  • 启用插件:rabbitmq-plugins enable rabbitmq_delayed_message_exchange
  • 重启RabbitMQ服务(部分环境需要)
  1. 检查中间件顺序
    确保UseMessageScheduler在UseScheduledRedelivery之前执行,保证上下文能被正确注入到管道中。

本地测试正常的可能原因:

  • 本地Docker镜像默认预装了延迟消息插件
  • 本地环境中调度器上下文被隐式初始化,服务器环境的配置校验更严格

内容的提问来源于stack exchange,提问作者HassanJalali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 00:53:23