#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. Повторная доставка сообщений не блокирует поток и не занимает слот одновременного сообщения / интервал предварительной выборки, сообщение позже повторно доставляется в очередь и принимается.