0

我试图在 MassTransit 状态机传奇中使用调度程序而不直接指定调度程序服务地址。

UseMessageScheduler在总线配置中使用它,它工作正常,因为我可以context.Schedule从我的消费者内部进行。

但是,它在 sagas 中不起作用。当我尝试做时.Schedule,我收到此错误:

指定了请求超时,但没有指定或可用的消息调度程序

我检查了 MT 代码,我看到了这个:

MessageSchedulerContext schedulerContext;
if (_request.Settings.SchedulingServiceAddress != null)
{
    ISendEndpoint scheduleEndpoint = await consumeContext.GetSendEndpoint(_request.Settings.SchedulingServiceAddress).ConfigureAwait(false);

    await scheduleEndpoint.ScheduleSend(consumeContext.ReceiveContext.InputAddress, expirationTime, message).ConfigureAwait(false);
}
else if (consumeContext.TryGetPayload(out schedulerContext))
    await schedulerContext.ScheduleSend(message, expirationTime, Pipe.Empty<SendContext>()).ConfigureAwait(false);
else
    throw new ConfigurationException("A request timeout was specified but no message scheduler was specified or available");

那么,实际上有一个分支应该正常从配置中获取调度器地址,但是为什么不起作用呢?

4

1 回答 1

0

因此,为了确保您正确配置调度程序,UseMessageScheduler应将调用放在主总线配置器上,以便所有端点都可以访问它。如果调度程序端点配置在同一个总线实例中,它应该类似于:

configurator.ReceiveEndpoint("quartz", e =>
{
    configurator.UseMessageScheduler(e.InputAddress);

    e.Consumer(() => new ScheduleMessageConsumer(scheduler));
    e.Consumer(() => new CancelScheduledMessageConsumer(scheduler));
});

请注意,端点地址是从接收端点提取的,并且调度程序是在主总线配置器上配置的。如果调度程序地址来自配置,则应将 URI 指定为地址。

于 2016-03-30T05:17:57.110 回答