是否可以将动态数据添加到 MassTransit courier/routing 滑动自定义事件?

Is it possible to add dynamic data to an MassTransit courier/routing slip custom event?

我配置了 MassTransit 路由单并且可以正常工作。作为参考,传送名单在 MongoDB 数据库中获取项目的 ID,然后使用 EF Core 在 SQL 数据库中创建该文档的 "version"。活动(作为命令)是:

  1. 将文档迁移到 SQL
  2. 更新 MongoDB 文档中的审核信息
  3. 更新MongoDB文档状态(即已发布)

以上均为写入命令。

我添加了一个新的第一步,它运行查询以确保 MongoDB 文档在 运行 迁移之前有效(例如名称和描述字段已完成)。如果此步骤失败,它会抛出一个自定义异常,这又会触发一个失败的事件,然后由我的 saga 获取和管理。下面是我的 activity 代码片段,后面是路由单生成器代码:

Activity代码

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,
    }));

虽然所有这些都有效并且事件被我的 saga 接收到,但我理想情况下希望将 ModuleValidationMessages(即任何失败的验证消息)添加到返回的事件中,但我无法弄清楚如何或什至这是可能的(或者如果这是正确的做法,则更根本)。

值得注意的是,这是最后的手段检查,客户端甚至在尝试迁移之前都会检查验证,所以更糟糕的情况我可以只保留它 "Has validation issues" 但理想情况下我想在失败的响应中包含脱轨。

很好的用例,是的,可以将您需要的详细信息添加到内置路由名单事件中。您可以 Terminate 路由单并包含变量 - 例如消息数组,而不是抛出异常,这些变量将添加到将要发布的 RoutingSlipTerminated 事件中。

这样一来,这就不是故障,而是过早终止传送名单的业务决策。这是上下文差异,这就是为什么它允许指定变量(相对于 Faulted,这是一个全倾斜的异常)。

然后您可以从变量中提取数组并在您的 saga 或消费者中使用它们。