是否可以将动态数据添加到 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"。活动(作为命令)是:
- 将文档迁移到 SQL
- 更新 MongoDB 文档中的审核信息
- 更新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 或消费者中使用它们。
我配置了 MassTransit 路由单并且可以正常工作。作为参考,传送名单在 MongoDB 数据库中获取项目的 ID,然后使用 EF Core 在 SQL 数据库中创建该文档的 "version"。活动(作为命令)是:
- 将文档迁移到 SQL
- 更新 MongoDB 文档中的审核信息
- 更新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 或消费者中使用它们。