C# 确定是否将从MassTransit 3中的观察者上下文重试消息

C# 确定是否将从MassTransit 3中的观察者上下文重试消息,c#,masstransit,C#,Masstransit,我想跟踪使用MassTransit 3时发生的邮件重试和重新传递次数。我已配置重试和重新交付: config.UseDelayedRedelivery(r => r.Immediate(2)); config.UseRetry(r => r.Immediate(3)); 我已按说明设置了一个IConsumeObserver和一个IReceiveObserver。我可以在PostConsume(consumercontext)/PostConsume(ReceiveContext)/

我想跟踪使用MassTransit 3时发生的邮件重试和重新传递次数。我已配置重试和重新交付:

config.UseDelayedRedelivery(r => r.Immediate(2));
config.UseRetry(r => r.Immediate(3));
我已按说明设置了一个
IConsumeObserver
和一个
IReceiveObserver
。我可以在
PostConsume(consumercontext)
/
PostConsume(ReceiveContext)
/
PostConsume(ReceiveContext)
中检查
consumercontext

但是,当检查上下文时,我看不到消息的上下文之间有什么区别,消息被毫无例外地使用,而消息在使用过程中抛出异常并将被重新传递


PostConsume
中,如何使用
IConsumeObserver
IReceiveObserver
的方法来确定
上下文
是否表示将重新发送的消息或已成功完成的消息?

消费者可以影响消息是否将重新发送,但它并没有完全控制或了解它。 例如,在消费端,一切都会成功,但这需要很长时间,发布者将重试,而消费者无法简单地知道这将发生

通常,最好设计应用程序,以便多次使用同一消息与一次性使用相同的效果

此外,如果您想查看以前是否使用过该消息,请在使用该消息时检查MessageId


ConsumerContext也有一个RetryCount,但我认为它在下次消费者运行之前不会递增。

您可以这样做。MassTransit在邮件标题中保留重新交付计数,否则,它将不知道根据您的策略何时停止重新交付

如果这一行返回非零(或者不为null,我不确定)-您正在处理一条重新传递的消息

context.Headers.Get(MessageHeaders.RedeliveryCount, default(int?)));

如果您的邮件正在重试(而不是重新发送),请查看Chris的回答:

谢谢@Doug。听起来我的问题的答案是“你不能”。我会等一等,确保没有人插话,“实际上你可以这样检查”,然后接受这个答案。谢谢@Alexey。这是我们现在用来记录指标的解决方案。但就我的问题而言,这并不是我想要的。标题似乎仅出现在重新交付尝试的PostConsume上。因此,这不能用来区分处理失败消息和成功消息的初始尝试。换句话说,我不想知道消息是否被重新传递,我想知道它是否会被重新传递。似乎必须有一个观察者来观察这个问题。不,这只是为了重试。排程在最后进行。但是,也许你可以从这行代码中看出,接收观察者将收到一个带有特殊类型消息的调用。我今天无法调查此事。但我明天会的!