Планирование Saga без указания адреса планировщика в MassTransit
Я пытаюсь использовать планировщик в саге о состоянии машины 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 ответ
Итак, чтобы убедиться, что вы настраиваете планировщик правильно, вызов UseMessageScheduler
должен быть размещен в конфигураторе основной шины, чтобы все конечные точки имели к нему доступ. Если конечная точка планировщика настроена в одном и том же экземпляре шины, она должна выглядеть примерно так:
configurator.ReceiveEndpoint("quartz", e =>
{
configurator.UseMessageScheduler(e.InputAddress);
e.Consumer(() => new ScheduleMessageConsumer(scheduler));
e.Consumer(() => new CancelScheduledMessageConsumer(scheduler));
});
Обратите внимание, что адрес конечной точки извлекается из конечной точки приема и что планировщик настроен на конфигураторе главной шины. Если адрес планировщика взят из конфигурации, в качестве адреса должен быть указан URI.