我已配置并正在运行MassTransit路由单。作为参考,路由清单将使用MongoDB数据库中项目的ID,然后使用EF Core在SQL数据库中创建该文档的“版本”。这些活动(作为命令)是:
以上所有都是写命令。
我添加了一个新的第一步,该步骤将运行查询以确保在运行迁移之前,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(即任何失败的验证消息)添加到要返回的事件中,但我不知道该怎么办甚至(或更重要的是,如果这样做是对的)。
值得注意的是,这是最后的检查,并且在尝试迁移之前由客户端检查了验证,因此,在更坏的情况下,我可以将其保留为“存在验证问题”,但理想情况下,我希望包括在失败的响应中脱轨。
答案 0 :(得分:1)
很好的用例,是的,可以将所需的详细信息添加到内置路由清单事件中。除了引发异常外,您还可以Terminate
路由清单,并包含变量-例如消息数组,这些变量将添加到将要发布的RoutingSlipTerminated
事件中。
这样,这不是故障,而是更多的业务决策,可以提前终止路由清单。这是上下文的差异,这就是为什么它允许指定变量的原因(相对于Faulted,这是全倾斜异常)。
然后您可以从变量中提取数组,并在传奇或使用者中使用它们。