我已经配置了MassTransit路线单,并且正在工作。作为参考,路由单在MongoDB数据库中获取一个项目的ID,然后使用EF Core在SQL数据库中创建该文档的"版本"。活动(作为命令)为:
- 将文档迁移到SQL
- 更新MongoDB文档中的审核信息
- 更新MongoDB文档状态(即已发布)
以上所有内容都是写入命令。
我添加了一个新的第一步,它在运行迁移之前运行查询以确保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(即任何失败的验证消息)添加到返回的事件中,但我不知道如何或是否可能(或者更根本地说,如果这是正确的做法)。
值得注意的是,这是最后的检查,客户端甚至在尝试迁移之前都会检查验证,所以在更糟糕的情况下,我可以将其保留为"存在验证问题",但理想情况下我希望在失败的响应中包括脱轨。
很好的用例,是的,可以将所需的详细信息添加到内置的路由单事件中。您可以Terminate
路由单,并包括变量(如消息数组),而不是抛出异常,这些变量将添加到将发布的RoutingSlipTerminated
事件中。
这样,提前终止路由单就不是的错误,而是一个更大的商业决策。这是一个上下文差异,这就是为什么它允许指定变量(与Faulted相比,Faulted是一个完全倾斜的例外)。
然后,您可以从变量中提取数组,并在您的传奇或消费者中使用这些数组。