我想跟踪使用MassTransit 3时发生的消息重试和重新发送的次数。我同时配置了重试和重新发送:
config.UseDelayedRedelivery(r => r.Immediate(2));
config.UseRetry(r => r.Immediate(3));
我已经按照here的说明设置了IConsumeObserver
和IReceiveObserver
。而且我可以检查ConsumeContext
/ ReceiveContext
中的PostConsume<T>(ConsumeContext<T> context)
/ PostReceive(ReceiveContext context)
。
但是,当检查上下文时,我看不到消息的上下文之间的差异,该消息无一例外地被使用,而消息在使用过程中被抛出异常并将被重新传递。
我如何在PostConsume
中使用IConsumeObserver
或IReceiveObserver
的方法来确定context
代表要重新发送的消息还是已成功完成的消息?
答案 0 :(得分:1)
您可以做到。 MassTransit会将重新交付计数保留在邮件标题中,否则,根据您的政策,它将不知道何时停止重新交付。
如果此行返回非零值(或不确定是否为null),则您正在处理重新传递的消息。
context.Headers.Get(MessageHeaders.RedeliveryCount, default(int?)));
如果您的邮件正在重试(未重新发送),请检查克里斯的回答:Get MassTransit message retries amount
答案 1 :(得分:0)
消费者可以影响是否重新发送邮件,但是它没有完全的控制权或知识。 例如,一切都可以在消费方成功,但是时间太长,发布者将重试,而消费者没有简单的方法知道这种情况会发生。
通常最好设计应用程序,以便多次使用同一条消息与一次使用相同的效果。
此外,如果要查看以前是否使用过该消息,请检查使用该消息时的MessageId。
ConsumeContext也具有RetryCount,但是我不相信它,直到消费者下次运行时,它才会递增。