我正在尝试在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");
所以,实际上有一个分支通常应该从配置中获取调度程序地址,但为什么它不起作用?
答案 0 :(得分:0)
因此,为确保正确配置调度程序,应将UseMessageScheduler
的调用放在主总线配置器上,以便所有端点都可以访问它。如果调度程序端点在同一总线实例中配置,则它应类似于:
configurator.ReceiveEndpoint("quartz", e =>
{
configurator.UseMessageScheduler(e.InputAddress);
e.Consumer(() => new ScheduleMessageConsumer(scheduler));
e.Consumer(() => new CancelScheduledMessageConsumer(scheduler));
});
请注意,端点地址是从接收端点提取的,并且调度程序是在主总线配置器上配置的。如果调度程序地址来自配置,则应将URI指定为地址。