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

使用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时抛出以下异常:

---&gt; 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 00:12:57