使用MassTransit Mediator时Saga中Request报调度器未找到异常
MassTransit Mediator模式下Saga执行Request时调度器缺失异常问题
环境与配置
使用MassTransit 8.1.3版本,采用Mediator传输方式,配置代码如下:
services.AddMediator(x => { x.AddSagaStateMachine<MyStateMachine, MyState>().InMemoryRepository(); });
Saga中的Request实现
在状态机中声明并使用Request的代码:
/* 首先在状态机中声明Request: public Request< MyState, GetSomething, GetSomethingResponse> GetSomethingRequest { get; private set; } = null!; */ Request(() => GetSomethingRequest); Initially(When(MyEvent) .Then(context => { // ... }) .Request(GetSomethingRequest, context => new GetSomething {}) .TransitionTo(MyOtherState));
异常信息
当Saga接收MyEvent时抛出以下异常:
---> MassTransit.ConfigurationException: A request timeout was specified but no message scheduler was specified or available at MassTransit.SagaStateMachine.RequestActivityImpl`3.SendRequest(BehaviorContext`1 context, SendTuple`1 sendTuple, Uri serviceAddress) in /_/src/MassTransit/SagaStateMachine/SagaStateMachine/Activities/RequestActivityImpl.cs:line 45 at MassTransit.SagaStateMachine.RequestActivity`4.Execute(BehaviorContext`2 context, IBehavior`2 next) in /_/src/MassTransit/SagaStateMachine/SagaStateMachine/Activities/RequestActivity.cs:line 110 at MassTransit.SagaStateMachine.ActivityBehavior`1.Execute[T](BehaviorContext`2 context) in /_/src/MassTransit/SagaStateMachine/SagaStateMachine/Behaviors/ActivityBehavior.cs:line 53
问题背景
尝试引入MassTransit.Quartz,并在ServiceCollection和IMediatorRegistrationConfigurator上调用.AddQuartz(),但问题未解决,不清楚是否遗漏配置,或是存在Bug。
解决方案
核心原因
Mediator模式默认未配置消息调度器,而Saga的Request操作依赖调度器处理超时逻辑——即便未显式设置超时,MassTransit也会启用默认30秒超时,因此必须配置可用的调度器。
内存调度器配置(推荐用于开发/简单场景)
无需引入第三方组件,直接使用MassTransit内置的内存调度器,修改Mediator配置即可:
services.AddMediator(x => { x.AddSagaStateMachine<MyStateMachine, MyState>().InMemoryRepository(); // 添加内存消息调度器 x.UseInMemoryScheduler(); });
持久化调度器配置(用于生产环境/需保留超时任务场景)
如果需要服务重启后仍保留超时任务,可使用Quartz,但需确保在Mediator配置中指定使用Quartz调度器:
// 注册Quartz服务 services.AddQuartz(); services.AddQuartzHostedService(); services.AddMediator(x => { x.AddSagaStateMachine<MyStateMachine, MyState>().InMemoryRepository(); // 指定Mediator使用Quartz调度器 x.UseQuartzScheduler(); });
问题根源说明
之前调用.AddQuartz()但未在Mediator配置中通过UseQuartzScheduler()绑定调度器,导致MassTransit无法识别并使用该调度器实例,因此仍会抛出缺失调度器的异常。
内容的提问来源于stack exchange,提问作者user606521
相关产品推荐
相关产品推荐

