使用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来处理延迟重发逻辑。
修复步骤:
- 为RabbitMQ配置消息调度器
在UsingRabbitMq配置块中添加消息调度器的初始化代码,确保在UseScheduledRedelivery之前配置:
busConfigurator.UsingRabbitMq((busContext, transportConfigurator) => { // 原Host配置代码... // 新增:启用消息调度器,指定延迟消息存储的交换器地址 transportConfigurator.UseMessageScheduler(new Uri($"rabbitmq://{builder.Configuration["EventBusSettings:HostAddress"]}/scheduled-messages")); // 原AutoStart、Retry、Redelivery等配置... });
- 确认服务器RabbitMQ已启用延迟消息插件
ScheduledRedelivery依赖RabbitMQ的rabbitmq_delayed_message_exchange插件,本地Docker镜像可能预装,但服务器环境需手动启用:
- 进入RabbitMQ容器:
docker exec -it <rabbitmq-container-name> bash - 启用插件:
rabbitmq-plugins enable rabbitmq_delayed_message_exchange - 重启RabbitMQ服务(部分环境需要)
- 检查中间件顺序
确保UseMessageScheduler在UseScheduledRedelivery之前执行,保证上下文能被正确注入到管道中。
本地测试正常的可能原因:
- 本地Docker镜像默认预装了延迟消息插件
- 本地环境中调度器上下文被隐式初始化,服务器环境的配置校验更严格
内容的提问来源于stack exchange,提问作者HassanJalali
相关产品推荐
相关产品推荐

