Можно ли добавить динамические данные в пользовательское событие MassTransit курьера / маршрутной квитанции?

У меня настроен и работает маршрутный лист MassTransit. Для справки: маршрутная квитанция принимает идентификатор элемента в базе данных MongoDB, а затем создает «версию» этого документа в базе данных SQL с помощью EF Core. Действия (как команды):

  1. Перенести документ в SQL
  2. Обновить информацию аудита в документе MongoDB
  3. Обновить статус документа MongoDB (т.е. опубликовать)

Все вышеперечисленное - это команды записи.

Я добавил новый 1-й шаг, который запускает запрос, чтобы убедиться, что документ MongoDB действителен (например, поля имени и описания заполнены) перед запуском миграции. Если этот шаг не удается, он генерирует настраиваемое исключение, которое, в свою очередь, запускает неудачное событие, которое затем подбирается и управляется моей сагой. Ниже приведен фрагмент кода моей активности, за которым следует код построителя маршрутной квитанции:

Код активности

var result = await _queryDispatcher.ExecuteAsync<SelectModuleValidationResultById, ModuleValidationResult>(query).ConfigureAwait(false);

if (!result.ModuleValidationMessages.Any())
{
    return context.Completed();
}

return context.Faulted(new ModuleNotValidException
{
    ModuleId = messageCommand.ModuleId,
    ModuleValidationMessages = result.ModuleValidationMessages
});

Код построения маршрутной квитанции

builder.AddActivity(
    nameof(Step1ValidateModule),
    context.GetDestinationAddress(ActivityHelper.BuildQueueName<Step1ValidateModule>(ActivityQueueType.Execute)),
    new SelectModuleValidationResultById(
        context.Message.ModuleId,
        context.Message.UserId,
        context.Message.LanguageId)
);

builder.AddSubscription(
    context.SourceAddress,
    RoutingSlipEvents.ActivityFaulted,
    RoutingSlipEventContents.All,
    nameof(Step1ValidateModule),
    x => x.Send<IModuleValidationFailed>(new
    {
        context.Message.ModuleId,
        context.Message.LanguageId,
        context.Message.UserId,
        context.Message.DeploymentId,
    }));

Хотя все это работает и событие подхватывается моей сагой, я в идеале хотел бы добавить ModuleValidationMessages (т.е. любые неудачные сообщения проверки) к возвращаемому событию, но я не могу понять, как или даже если это возможно (или более принципиально если это правильно делать).

Стоит отметить, что это проверка в крайнем случае, и что валидация проверяется клиентом еще до того, как попытаться выполнить миграцию, поэтому в худшем сценарии я могу просто оставить, что у него есть «Проблемы с валидацией», но в идеале я хотел бы включить отказ в неудавшийся ответ.


person Ben Thomson    schedule 12.02.2019    source источник


Ответы (1)


Хороший вариант использования, и да, можно добавить нужные детали к встроенным событиям проскальзывания маршрутизации. Вместо того, чтобы генерировать исключение, вы можете Terminate маршрутную накладку и включать переменные, такие как массив сообщений, которые добавляются к RoutingSlipTerminated событию, которое будет опубликовано.

Таким образом, преждевременное прекращение маршрутной ошибки является не ошибкой, а скорее бизнес-решением. Это контекстная разница, поэтому она позволяет указывать переменные (по сравнению с ошибкой, которая является исключением полного наклона).

Затем вы можете извлечь массив из переменных и использовать их в своей саге или потребителе.

person Chris Patterson    schedule 12.02.2019