没有在MassTransit中指定调度程序地址的Saga调度

时间:2016-03-29 08:10:54

标签: masstransit saga automatonymous

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

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

然而,它在传奇中不起作用。当我尝试.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");

所以,实际上有一个分支通常应该从配置中获取调度程序地址,但为什么它不起作用?

1 个答案:

答案 0 :(得分:0)

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

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

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

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