C# 使用MassTransit组合UserEry()和UseScheduledRedelivery()

C# 使用MassTransit组合UserEry()和UseScheduledRedelivery(),c#,rabbitmq,masstransit,C#,Rabbitmq,Masstransit,是否可以在使用者端将这两种方法结合起来,如果在消息消费过程中发生异常,第一件事就是重试,并且当重试策略用尽时,将使用InMemoryScheduler通过quartz重新传递消息?结合这些方法时,我得到的行为是,对于每次重新交付,我都会得到一次重试,但这不是我需要的……我想知道是否可以先得到重试,然后再得到重新交付,但不需要额外的重试尝试?文档中有一节详细解释了如何执行您想要的操作 简而言之,您需要配置message scheduler,然后按如下所示的顺序添加筛选器,以使其按预期工作: cfg

是否可以在使用者端将这两种方法结合起来,如果在消息消费过程中发生异常,第一件事就是重试,并且当重试策略用尽时,将使用InMemoryScheduler通过quartz重新传递消息?结合这些方法时,我得到的行为是,对于每次重新交付,我都会得到一次重试,但这不是我需要的……我想知道是否可以先得到重试,然后再得到重新交付,但不需要额外的重试尝试?

文档中有一节详细解释了如何执行您想要的操作

简而言之,您需要配置message scheduler,然后按如下所示的顺序添加筛选器,以使其按预期工作:

cfg.UseMessageScheduler(new Uri("rabbitmq://localhost/quartz"));

cfg.ReceiveEndpoint(host, "submit-order", e =>
{
    e.UseScheduledRedelivery(r => r.Intervals(TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(30)));
    e.UseMessageRetry(r => r.Immediate(5));
    e.Consumer(() => new SubmitOrderConsumer(sessionFactory));
});

此示例将提供初始立即重试(您可以对任一筛选器使用任何重试策略),并在立即重试用尽后使用重新送达。

不完全是,它们是分开的。
UseMessageRetry
实际上应该仅限于瞬时故障,而重新交付更常用于处理长时间停机或业务条件异常。谢谢。我在文档中看到了这一点,但是配置有点不同,所以这是一个问题。现在它正在按预期工作。我还有一个问题。消息重新传递是否会以与重试相同的方式阻止线程?消息重新传递不会阻止线程,也不会保留并发消息槽/预回迁计数槽,消息稍后会重新传递到队列并拾取。