Планирование 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.

Другие вопросы по тегам