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

Determine if message will be retried from observer context in MassTransit 3

我想跟踪使用 MassTransit 3 时发生的消息重试和重新传递的次数。我同时配置了重试和重新传递:

config.UseDelayedRedelivery(r => r.Immediate(2));
config.UseRetry(r => r.Immediate(3));

我已经按照 here 的描述设置了 IConsumeObserverIReceiveObserver。我可以在 PostConsume<T>(ConsumeContext<T> context)/PostReceive(ReceiveContext context).

中检查 ConsumeContext/ReceiveContext

但是在检查上下文时,我看不出无一例外地使用的消息的上下文与在使用期间抛出异常并将重新传送的消息的上下文之间的区别。

如何在 IConsumeObserverIReceiveObserverPostConsume 方法中确定 context 代表将重新传送的消息还是已完成的消息成功了吗?

消费者可以影响是否重新传递消息,但它不具有完全控制权或不了解它。 例如,在消费端一切都成功了,只是时间太长了,发布者会重试,而消费者没有简单的方法知道这会发生。

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

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

ConsumeContext 也有一个 RetryCount,但我不相信它会递增直到消费者下次运行。

你可以的。 MassTransit 在消息中保留重新投递计数 headers,否则,根据您的政策,它不知道何时停止重新投递。

如果此行 returns 为 non-zero(或不为空,我不确定)- 您正在处理重新发送的消息。

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

如果您的邮件正在重试(未重新投递),请查看 Chris 的回答:Get MassTransit message retries amount