gpt4 book ai didi

c# - 带参数的 MassTransit 事件故障

转载 作者:行者123 更新时间:2023-11-30 12:08:55 24 4
gpt4 key购买 nike

我目前在 Courier 中使用 Masstransit模式。

我设置了一个可能会失败的 Activity,我希望能够订阅此失败并采取相应措施。

我的问题是,即使我可以订阅失败,甚至可以看到导致失败的异常,我也无法向它传递任何参数。

出于测试目的,假设我有以下事件:

public class MyActivity : ExecuteActivity<MyMessage>
{
public Task<ExecutionResult> Execute(ExecuteContext<MyMessage> context)
{
try
{
// .... some code
throw new FaultException<RegistrationRefusedData>(
new RegistrationRefusedData(RegistrationRefusedReason.ItemUnavailable));
// .... some code
}
catch (Exception ex)
{
return Task.FromResult(context.Faulted(ex));
}
}
}

问题出在我作为异常参数传递的原因 (RegistrationRefusedReason) 中。如果我订阅一个 RoutingSlipActivityFaulted 消费者,我几乎可以获得我需要的所有信息:

public class ActivityFaultedConsumer : IMessageConsumer<RoutingSlipActivityFaulted>
{
public void Consume(RoutingSlipActivityFaulted message)
{
string exceptionMessage = message.ExceptionInfo.Message; // OK
string messageType = message.ExceptionInfo.ExceptionType; // OK
RegistrationRefusedReason reason = ??????;
}
}

我觉得我在这里遗漏了一些重要的东西,(也许滥用了模式?)。

有没有其他方法可以从错误的事件中获取参数?

最佳答案

因此,您描述的情况不是故障。不符合商业条件是失败的。在这种情况下,您不想重试交易,而是想终止它。要通知传送名单的发起者,您将发布一个业务事件,表明交易由于业务状况而未完成。

例如,在您的情况下,您可以执行以下操作:

context.Publish<RegistrationRefused>(new {
CustomerId = xxx,
ItemId = xxxx,
Reason = "Item was unavailable"
});

context.Terminate();

这将终止路由单(后续事件将不会执行),并产生一个 RoutingSlipTerminated 事件。

这是根据业务条件或规则结束传送名单的正确方法。异常仅适用于异常行为,因为您可能希望重试它们来处理失败。

关于c# - 带参数的 MassTransit 事件故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45699396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com