Можно ли добавить динамические данные в пользовательское событие курьерской / маршрутной квитанции MassTransit? - PullRequest
0 голосов
/ 12 февраля 2019

У меня настроен бланк маршрутизации 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 (т.е. любые сообщения о неудачной проверке) к возвращаемому событию, но я не могу понять, как или даже если это возможно (или более фундаментально, если это правильно)что нужно сделать).

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

1 Ответ

0 голосов
/ 12 февраля 2019

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

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

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

...