Объединить UseRetry() и UseScheduledRedelivery() с помощью MassTransit

#c# #rabbitmq #masstransit

#c# #rabbitmq #массовый переход

Вопрос:

Возможно ли объединить эти два метода на стороне потребителя таким образом, чтобы, если во время приема сообщения возникнет исключение, первым, что произойдет, была бы повторная попытка, а когда политика повторных попыток будет исчерпана, сообщение будет повторно доставлено через quartz с использованием InMemoryScheduler? Поведение, которое я получил при объединении этих методов, заключается в том, что для каждой повторной доставки я получал бы повторную попытку, но это не то, что мне нужно…Я хотел бы знать, возможно ли сначала выполнить повторную попытку, и только затем получить повторную доставку, но без дополнительной попытки повтора?

Ответ №1:

В документации есть раздел, который точно объясняет, как сделать то, что вы хотите здесь

Короче говоря, вам нужно настроить планировщик сообщений, а затем добавить фильтр в порядке, показанном ниже, чтобы он работал так, как вы ожидаете:

 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));
});
  

В этом примере будут предоставлены первоначальные немедленные попытки (вы можете использовать любую политику повторных попыток с любым фильтром) и использовать повторные доставки после исчерпания немедленных попыток.

Комментарии:

1. На самом деле нет, они разделены. UseMessageRetry Действительно должно быть ограничено временными сбоями, тогда как повторная доставка чаще используется для обработки длительных простоев или исключений бизнес-условий.

2. Спасибо. Я видел это в документации, но немного изменил конфигурацию, так что это было проблемой. Теперь это работает так, как ожидалось. У меня есть еще один вопрос. Повторная доставка сообщения блокирует поток таким же образом, как и повторная попытка?

3. Повторная доставка сообщений не блокирует поток и не занимает слот одновременного сообщения / интервал предварительной выборки, сообщение позже повторно доставляется в очередь и принимается.