0

我已配置并运行了 MassTransit 路由单。作为参考,路由单采用 MongoDB 数据库中项目的 ID,然后使用 EF Core 在 SQL 数据库中创建该文档的“版本”。活动(作为命令)是:

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

以上都是写命令。

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

活动代码

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 (即任何失败的验证消息)添加到返回的事件中,但我无法弄清楚如何或即使这是可能的(或更多基本上,如果这样做是正确的)。

值得注意的是,这是最后的检查,并且验证是由客户端在尝试迁移之前检查的,所以更糟糕的情况是我可以让它有“有验证问题”,但理想情况下我想将脱轨包含在响应失败。

4

1 回答 1

1

很好的用例,是的,可以将您需要的详细信息添加到内置的路由滑动事件中。除了抛出异常之外,您还可以Terminate使用路由表,并包含变量 - 例如消息数组,这些变量将添加到RoutingSlipTerminated将要发布的事件中。

这样,过早终止路由单就不是错误,而是更多的业务决策。这是一个上下文差异,这就是它允许指定变量的原因(相对于 Faulted,这是一个完全倾斜的异常)。

然后,您可以从变量中提取数组并在您的 saga 或使用者中使用这些数组。

于 2019-02-12T14:55:31.770 回答