确定是否从MassTransit 3

时间:2018-10-08 20:34:21

标签: c# masstransit

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

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

我已经按照here的说明设置了IConsumeObserverIReceiveObserver。而且我可以检查ConsumeContext / ReceiveContext中的PostConsume<T>(ConsumeContext<T> context) / PostReceive(ReceiveContext context)

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

我如何在PostConsume中使用IConsumeObserverIReceiveObserver的方法来确定context代表要重新发送的消息还是已成功完成的消息?

2 个答案:

答案 0 :(得分:1)

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

如果此行返回非零值(或不确定是否为null),则您正在处理重新传递的消息。

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

如果您的邮件正在重试(未重新发送),请检查克里斯的回答:Get MassTransit message retries amount

答案 1 :(得分:0)

消费者可以影响是否重新发送邮件,但是它没有完全的控制权或知识。 例如,一切都可以在消费方成功,但是时间太长,发布者将重试,而消费者没有简单的方法知道这种情况会发生。

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

此外,如果要查看以前是否使用过该消息,请检查使用该消息时的MessageId。

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